[MCU] 一则CH548/CH549例程ADC程序的bug解决

火辣西米秀   2021-6-28 07:36 楼主

用官方例程测量外部电压,使用的AIN1通道,也就是P1.1引脚。外部使用2个电阻分压输入到P1.1引脚。实测发现电压大于实际电压,4V电压分压后应该是2V左右,用万用表量确有2.6V。

以为电阻错了,检查后没有问题。

怀疑单片机引脚使能了上拉。查看了WCH例程发现了问题。


#define  CH0                            0
#define  CH1                            1
#define  CH2                            2
#define  CH3                            3
……

ADC_ChSelect(CH1);


/*******************************************************************************
* Function Name  : ADC_ChSelect
* Description    : ADC 外部通道选择
* Input          : UINT8 ch
                   ch, 位域 0~15bit分别对应外部16通道
* Output         : None
* Return         : None
*******************************************************************************/
void ADC_ChSelect( UINT8 ch )
{
    ADC_CHAN = (ADC_CHAN & ~MASK_ADC_CHAN) | ch;
    if(ch<=7)                                  //P10~P17引脚配置,不用每次都设置
    {
        P1_MOD_OC &= ~(ch&0xFF);                       //高阻输入
        P1_DIR_PU &= ~(ch&0xFF);
    }
    if(ch>7 && ch<=0x0f)                                  //P00~P07引脚配置,不用每次都设置
    {
        P0_MOD_OC &= ~((ch-7)&0xFF);                  //高阻输入
        P0_DIR_PU &= ~((ch-7)&0xFF);
    }
}

官方库的选择通道配置的是高阻输入,但当通道1参数进来时实际上是将P1.0配置成了高阻输入,而产非P1.1。
P1_MOD_OC = 0xfe;                       
P1_DIR_PU= 0xfe;

看了手册引脚上电默认是准双向带上拉模式。

因此这个应该是1<<ch后再操作吧???

回复评论 (3)

解决办法也很简单,这样定义下就好了

如下:

//通道号选择,分别对应P1.0~P1.7, P0.0~P0.7
#define  CH0                            0x0001
#define  CH1                            0x0002
#define  CH2                            0x0004
#define  CH3                            0x0008
#define  CH4                            0x0010
#define  CH5                            0x0020
#define  CH6                            0x0040
#define  CH7                            0x0080
#define  CH8                            0x0100
#define  CH9                            0x0200
#define  CH10                           0x0400
#define  CH11                           0x0800
#define  CH12                           0x1000
#define  CH13                           0x2000
#define  CH14                           0x4000
#define  CH15                           0x8000
#define  CHALL                          0xFFFF
 

点赞  2021-6-28 07:37

刚刚看了官方的代码,好像确实像你说的这样,应该设置对应的位来选择对应的通道。

官方的代码使用的是0~16,如果是这样,如果输出参数是3,这时实际测量的数据应该是通道1和2的轮询值吗?

image.png

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2021-6-28 11:26
感谢作者无私的分享。非常精彩的内容,学习了,受益匪浅。非常感谢。
点赞  2024-10-7 12:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复