用官方例程测量外部电压,使用的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后再操作吧???
解决办法也很简单,这样定义下就好了
如下:
//通道号选择,分别对应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