找回密码
 立即注册
查看: 653|回复: 2

从门到放弃 1K17的ADC配置问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2024-07-14 13:13:18

7

主题

20

回帖

128

积分

注册会员

积分
128
发表于 2024-7-10 22:49:55 | 显示全部楼层 |阅读模式
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[5] = 2
calc_buf[6] = 238
calc_buf[7] = 2
calc_buf[8] = 238
calc_buf[9] = 2
calc_buf[10] = 238
calc_buf[11] = 2
calc_buf[12] = 238
calc_buf[13] = 2
calc_buf[14] = 238
calc_buf[15] = 2
calc_buf[16] = 238
calc_buf[17] = 2
calc_buf[18] = 238
calc_buf[19] = 2
calc_buf[20] = 238
calc_buf[21] = 2
calc_buf[22] = 238
calc_buf[23] = 2
calc_buf[24] = 238
calc_buf[25] = 2
calc_buf[26] = 238
calc_buf[27] = 2
calc_buf[28] = 238
calc_buf[29] = 2
calc_buf[30] = 238
calc_buf[31] = 2
calc_buf[32] = 238
calc_buf[33] = 2
calc_buf[34] = 238
calc_buf[35] = 2
calc_buf[36] = 238
calc_buf[37] = 2
calc_buf[38] = 238
calc_buf[39] = 2
calc_buf[40] = 238
calc_buf[41] = 2
calc_buf[42] = 238
calc_buf[43] = 2
calc_buf[44] = 238
calc_buf[45] = 2
calc_buf[46] = 238
calc_buf[47] = 2
calc_buf[48] = 238
calc_buf[49] = 2
calc_buf[50] = 238
calc_buf[51] = 2
calc_buf[52] = 238
calc_buf[53] = 2
calc_buf[54] = 238
calc_buf[55] = 2
calc_buf[56] = 238
calc_buf[57] = 2
calc_buf[58] = 238
calc_buf[59] = 2
calc_buf[60] = 238
calc_buf[61] = 2
calc_buf[62] = 238
calc_buf[63] = 2
calc_buf[64] = 238
calc_buf[65] = 2
calc_buf[66] = 238
calc_buf[67] = 2
calc_buf[68] = 238
<3> 这里ADC寄存器是两个字节  打印2个8位的数据 结果是2*256+238 = 750  这里采集32个点   平均值依旧是750
<4> 好奇运放跟随割断是对的 1.615V  但是接到单片机又不对了    我怀疑是初始化哪里问题  但是NTC通道的 通道1也就是P11口又可以正确的读取并计算温度  肯定有经验的大佬 指导下  


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2024-07-14 13:13:18

7

主题

20

回帖

128

积分

注册会员

积分
128
发表于 2024-7-10 22:51:57 | 显示全部楼层
{:5_270:} 我顶我自己系列  真不明白是什么原因了C:\Users\Administrator\Desktop\临时 文件夹\1
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2024-07-14 13:13:18

7

主题

20

回帖

128

积分

注册会员

积分
128
发表于 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所有引脚
#define  P0_mode_out_pp(Pin)                        P0M1 &= ~(Pin), P0M0 |= (Pin);
#define  P1_mode_out_pp(Pin)                        P1M1 &= ~(Pin), P1M0 |= (Pin);
#define  P2_mode_out_pp(Pin)                        P2M1 &= ~(Pin), P2M0 |= (Pin);
#define  P3_mode_out_pp(Pin)                        P3M1 &= ~(Pin), P3M0 |= (Pin);
#define  P4_mode_out_pp(Pin)                        P4M1 &= ~(Pin), P4M0 |= (Pin);
#define  P5_mode_out_pp(Pin)                        P5M1 &= ~(Pin), P5M0 |= (Pin);
#define  P6_mode_out_pp(Pin)                        P6M1 &= ~(Pin), P6M0 |= (Pin);
#define  P7_mode_out_pp(Pin)                        P7M1 &= ~(Pin), P7M0 |= (Pin);
问题解决 注意上面的宏定义  这里pin_5  不能简单随手写成5       因为0x05 等于 0x04 + 0x01 也就导致P10口的上拉被使能  然后跟随器的输出一半VCC 再和上拉的4.7K分电源电压 等于2.4V{:5_270:}
回复 支持 1 反对 0

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-30 16:59 , Processed in 0.116150 second(s), 56 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表