买个AD7705拿到手一看是TM7705,说是全面兼容,找了个例程修改一下串口出来全是0.
求大神看看那个地方有问题,代码如下:
#include <arduino.h>
#define ADC_DI 5 // DIN
#define ADC_DOUT 6 // DOUT
#define ADC_CLK 4 // SCK
#define ADC1_CS 3 // CS
#define ADC_CLK0 digitalWrite(ADC_CLK, 0);
#define ADC_CLK1 digitalWrite(ADC_CLK, 1);
#define ADC_DI0 digitalWrite(ADC_DI, 0);
#define ADC_DI1 digitalWrite(ADC_DI, 1);
#define ADC1_CS0 digitalWrite(ADC1_CS, 0);
#define ADC1_CS1 digitalWrite(ADC1_CS, 1);
#define ADC_DO digitalRead(ADC_DOUT);
enum
{
REG_COMM = 0x00,
REG_SETUP = 0x10,
REG_CLOCK = 0x20,
REG_DATA = 0x30,
REG_ZERO_CH1 = 0x60,
REG_FULL_CH1 = 0x70,
REG_ZERO_CH2 = 0x61,
REG_FULL_CH2 = 0x71,
WRITE = 0x00,
READ = 0x08,
CH_1 = 0,
CH_2 = 1,
};
void adc_delay(unsigned char NUM)
{
for (; NUM > 0; NUM--)
;
}
void write_adc_byte(unsigned char chr)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (chr & 0x80)
{
ADC_DI1;
}
else
{
ADC_DI0;
}
ADC_CLK0;
chr = chr << 1;
ADC_CLK1;
}
}
unsigned int read_adc_word()
{
unsigned char i;
unsigned int coder = 0;
byte dread;
for (i = 0; i < 16; i++)
{
ADC_CLK0;
adc_delay(1);
coder = coder << 1;
dread = ADC_DO;
if (dread)
coder += 1; // 检测ADC_DO引脚电平,读入数据
ADC_CLK1;
}
ADC_CLK1;
return (coder);
}
void adc1_init(void)
{
// 1) realign synchro
ADC1_CS0;
write_adc_byte(0xFF);
write_adc_byte(0xFF);
write_adc_byte(0xFF);
write_adc_byte(0xFF);
ADC1_CS1;
delay(10);
// 2) setup clock
ADC1_CS0;
write_adc_byte(REG_CLOCK | WRITE | CH_1); // next operation is write in clock registery for ch1
ADC1_CS1;
adc_delay(10);
ADC1_CS0;
// Clock Register
write_adc_byte(0b00001111); // clock div, freq >2Mhz filter = 500hz
ADC1_CS1;
delay(20);
// 3) config setup register
ADC1_CS0;
write_adc_byte(REG_SETUP | WRITE | CH_1); // next operation is write in setup registry for Ch1
ADC1_CS1;
adc_delay(10);
ADC1_CS0;
// Setup Register
write_adc_byte(0b00000110); // 00 000 1 1 0 = normal Gain1 unipolar with_buffer
ADC1_CS1;
delay(20);
}
unsigned int adc1_read_value(unsigned char ch)
{
unsigned int value;
ADC1_CS0;
if (ch == 1)
write_adc_byte(0x38);
else if (ch == 2)
write_adc_byte(0x39);
else
{
ADC1_CS1;
return 0;
}
ADC1_CS1;
adc_delay(1);
ADC1_CS0;
value = read_adc_word();
ADC1_CS1;
return value;
}
int volt1, volt2;
unsigned int temp1, temp2;
void setup(void)
{
pinMode(ADC_CLK, OUTPUT);
pinMode(ADC1_CS, OUTPUT);
pinMode(ADC_DI, OUTPUT);
pinMode(ADC_DOUT, INPUT_PULLUP);
adc1_init();
Serial.begin(115200);
}
void loop(void)
{
delay(7);
temp1 = adc1_read_value(1);
volt1 = temp1 * (5000.0 / 65535);
Serial.printf("channel1: %5d %.4V:%d\n", temp1, volt1);
delay(7);
temp2 = adc1_read_value(2);
volt2 = ((int)temp2 * 5000) / 65535;
// Serial.printf("channel2: %d V:%d\n", temp2, volt2);
}
--
FROM 112.32.39.*