zhs2608190303 发表于 2024-7-10 22:49:55

从门到放弃 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口又可以正确的读取并计算温度肯定有经验的大佬 指导下


zhs2608190303 发表于 2024-7-10 22:51:57

{:5_270:} 我顶我自己系列真不明白是什么原因了C:\Users\Administrator\Desktop\临时 文件夹\1

zhs2608190303 发表于 2024-7-10 23:28:29

#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]
查看完整版本: 从门到放弃 1K17的ADC配置问题