我的源代码如下:
void Init_Ad(void)
{
ADC1_DeInit();
ADC1->CR1 = 0x72; // fadc = fmaster / 18,使能连续转换模式
ADC1->CR2 = 0x08; // 数据右对齐
ADC1->DRH = 0;
ADC1->DRL = 0;
// ADC1->CR3 = 0x00; // 不使用数据缓冲
// ADC1->TDRL = 0x4c; // AIN2、AIN3、AIN6
}
unsigned short Get_Ad(unsigned char Channel)
{
unsigned char i;
unsigned short temp = 0;
unsigned short result = 0;
Init_Ad();
ADC1->CSR = Channel&0x0f;
ADC1->CR1 |= 0x01; // 将ADC从休眠状态唤醒
for (i = 0;i < 100;i++);
ADC1->CR1 |= 0x01; // 启动AD转换
for (i = 0;i < 8;i++)
{
ADC1->CSR &= 0x7f; // 清除EOC转换结束标志
while ((ADC1->CSR & 0x80) == 0){} // 等待转换完成
// result += (ADC1->DRH * 256 + ADC1->DRL); // Then read MSB
temp = ADC1->DRL;
temp = temp + ADC1->DRH * 256;
result = result + temp;
}
ADC1->CR1 &= 0xfe;
return (unsigned short)(result/8);
}
AD是连续模式,单通道使用基本没有问题,但是,如果是多通道轮询,通道之间的影响就比较大,如:
Temp = Get_Ad(BAT_T_CH);
Vol = Get_Ad(BAT_T_CH);
Vol的值受Temp的影响非常大,不知如何解决,请大神们指点。
跪谢了!
|