打印
[单片机芯片]

好像找到了找到CH548/CH549例程ADC程序的bug

[复制链接]
7464|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanggexiaosa|  楼主 | 2021-6-20 19:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天用官方例程测量外部电压,使用的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后再操作吧???

使用特权

评论回复
沙发
WCHTech2| | 2021-6-25 13:35 | 只看该作者
本帖最后由 WCHTech2 于 2021-6-28 10:53 编辑

//通道号选择,分别对应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

/*******************************************************************************
* 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 & 0x00FF)                                  //P10~P17引脚配置,不用每次都设置
    {
        P1_MOD_OC &= ~(ch&0xFF);                       //高阻输入
        P1_DIR_PU &= ~(ch&0xFF);
    }
    if(ch & 0xFF00)                                  //P00~P07引脚配置,不用每次都设置
    {
        P0_MOD_OC &= ~((ch>>8)&0xFF);                  //高阻输入
        P0_DIR_PU &= ~((ch>>8)&0xFF);
    }
}

这样定义下就好了,例程会及时更新的

使用特权

评论回复
板凳
yanggexiaosa|  楼主 | 2021-6-28 09:47 | 只看该作者
WCHTech2 发表于 2021-6-25 13:35
//通道号选择,分别对应P1.0~P1.7, P0.0~P0.7
#define  CH0                            0x0001
#define  CH ...

这样宏定义的还是不行的,ADC_CHAN = (ADC_CHAN & ~MASK_ADC_CHAN) | ch;
这条语句又不能用了

使用特权

评论回复
评论
WCHTech2 2021-6-28 10:56 回复TA
已更新,见楼上回复 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

21

帖子

1

粉丝