一则CH548/CH549例程ADC程序的bug解决
<p>用官方例程测量外部电压,使用的AIN1通道,也就是P1.1引脚。外部使用2个电阻分压输入到P1.1引脚。实测发现电压大于实际电压,4V电压分压后应该是2V左右,用万用表量确有2.6V。</p><p>以为电阻错了,检查后没有问题。</p>
<p>怀疑单片机引脚使能了上拉。查看了WCH例程发现了问题。</p>
<p><br />
#define CH0 0<br />
#define CH1 1<br />
#define CH2 2<br />
#define CH3 3<br />
……</p>
<p>ADC_ChSelect(CH1);</p>
<p><br />
/*******************************************************************************<br />
* Function Name : ADC_ChSelect<br />
* Description : ADC 外部通道选择<br />
* Input : UINT8 ch<br />
ch, 位域 0~15bit分别对应外部16通道<br />
* Output : None<br />
* Return : None<br />
*******************************************************************************/<br />
void ADC_ChSelect( UINT8 ch )<br />
{<br />
ADC_CHAN = (ADC_CHAN & ~MASK_ADC_CHAN) | ch;<br />
if(ch<=7) //P10~P17引脚配置,不用每次都设置<br />
{<br />
P1_MOD_OC &= ~(ch&0xFF); //高阻输入<br />
P1_DIR_PU &= ~(ch&0xFF);<br />
}<br />
if(ch>7 && ch<=0x0f) //P00~P07引脚配置,不用每次都设置<br />
{<br />
P0_MOD_OC &= ~((ch-7)&0xFF); //高阻输入<br />
P0_DIR_PU &= ~((ch-7)&0xFF);<br />
}<br />
}</p>
<p>官方库的选择通道配置的是高阻输入,但当通道1参数进来时实际上是将P1.0配置成了高阻输入,而产非P1.1。<br />
P1_MOD_OC = 0xfe; <br />
P1_DIR_PU= 0xfe;</p>
<p>看了手册引脚上电默认是准双向带上拉模式。</p>
<p>因此这个应该是1<<ch后再操作吧???</p>
<p>解决办法也很简单,这样定义下就好了</p>
<p>如下:</p>
<p>//通道号选择,分别对应P1.0~P1.7, P0.0~P0.7<br />
#define CH0 0x0001<br />
#define CH1 0x0002<br />
#define CH2 0x0004<br />
#define CH3 0x0008<br />
#define CH4 0x0010<br />
#define CH5 0x0020<br />
#define CH6 0x0040<br />
#define CH7 0x0080<br />
#define CH8 0x0100<br />
#define CH9 0x0200<br />
#define CH10 0x0400<br />
#define CH11 0x0800<br />
#define CH12 0x1000<br />
#define CH13 0x2000<br />
#define CH14 0x4000<br />
#define CH15 0x8000<br />
#define CHALL 0xFFFF<br />
</p>
<p>刚刚看了官方的代码,好像确实像你说的这样,应该设置对应的位来选择对应的通道。</p>
<p>官方的代码使用的是0~16,如果是这样,如果输出参数是3,这时实际测量的数据应该是通道1和2的轮询值吗?</p>
<p></p>
页:
[1]