从门到放弃 1K17的ADC配置问题
void adc_init_channel(uint8_t channel){
if (channel < 0 || channel > 15)
return;
// Set or clear P1M0 and P1M1 based on channel
if (channel >= 0 && channel <= 7)
{
P1M0 &= ~(0x01 << channel);
P1M1 |= (0x01 << channel);
// P1_mode_in_hiz(channel);
}
else if (channel >= 8 && channel <= 14)
{
P3M0 &= ~(0x01 << (channel - 8));
P3M1 |= (0x01 << (channel - 8));
// P3_mode_in_hiz(channel);
}
ADC_CONTR &= ~0x0F;
ADC_CONTR |= channel;
P_SW2 |= 0x80;
ADCTIM = 0x3f;
P_SW2 &= ~0x80;
ADCCFG = 0x2f;
ADC_CONTR |= 0x80;
sleep_ms(10);
}
上面是ADC初始化函数 然后初始化P10 P11 口位ADC 一路温度 一路电流
adc_init_channel(1); //NTC
adc_init_channel(0); //C
我发现温度这一路是对的 但是电流这一路 因为抬升值是VCC一半 应该采集到的是512但是我每次采集到749 750 测量IO口管脚 原本输入给IO口的是1.625V 到单片机管脚变成2.4V
<1> 于是我将运放的跟随器输出一半VCC 到单片机IO口割段测量运放跟随的一半VCC是对的 此时测量单片机是3.3V 工作电压
<2> 短接上去 就变成了2.4V 我真理解不了为什么 以下是我打印的结果
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
calc_buf = 2
calc_buf = 238
<3> 这里ADC寄存器是两个字节打印2个8位的数据 结果是2*256+238 = 750这里采集32个点 平均值依旧是750
<4> 好奇运放跟随割断是对的 1.615V但是接到单片机又不对了 我怀疑是初始化哪里问题但是NTC通道的 通道1也就是P11口又可以正确的读取并计算温度肯定有经验的大佬 指导下
{:5_270:} 我顶我自己系列真不明白是什么原因了C:\Users\Administrator\Desktop\临时 文件夹\1 #define ntc_switc_on()do{P1_mode_out_pp(pin_5); P15 = 1;}while(0)
#define ntc_switc_off() do{P1_mode_out_pp(pin_5); P15 = 0;}while(0)
#define pin_0 0x01 //IO引脚 Px.0
#define pin_1 0x02 //IO引脚 Px.1
#define pin_2 0x04 //IO引脚 Px.2
#define pin_3 0x08 //IO引脚 Px.3
#define pin_4 0x10 //IO引脚 Px.4
#define pin_5 0x20 //IO引脚 Px.5 //0x05
#define pin_6 0x40 //IO引脚 Px.6
#define pin_7 0x80 //IO引脚 Px.7
#define pin_low 0x0F //IO低4位引脚
#define pin_high 0xF0 //IO高4位引脚
#define pin_all 0xFF //IO所有引脚
#defineP0_mode_out_pp(Pin) P0M1 &= ~(Pin), P0M0 |= (Pin);
#defineP1_mode_out_pp(Pin) P1M1 &= ~(Pin), P1M0 |= (Pin);
#defineP2_mode_out_pp(Pin) P2M1 &= ~(Pin), P2M0 |= (Pin);
#defineP3_mode_out_pp(Pin) P3M1 &= ~(Pin), P3M0 |= (Pin);
#defineP4_mode_out_pp(Pin) P4M1 &= ~(Pin), P4M0 |= (Pin);
#defineP5_mode_out_pp(Pin) P5M1 &= ~(Pin), P5M0 |= (Pin);
#defineP6_mode_out_pp(Pin) P6M1 &= ~(Pin), P6M0 |= (Pin);
#defineP7_mode_out_pp(Pin) P7M1 &= ~(Pin), P7M0 |= (Pin);
问题解决 注意上面的宏定义这里pin_5不能简单随手写成5 因为0x05 等于 0x04 + 0x01 也就导致P10口的上拉被使能然后跟随器的输出一半VCC 再和上拉的4.7K分电源电压 等于2.4V{:5_270:}
页:
[1]