通过反复试验得到了一个比较好用的带缓存,带平均滤波的ADC读取方法,提供出来给各位参考。各位大侠欢迎拍砖。
u16 adc_trans(u8 channel)
{
u8 k = 0;
u32 sum_adc = 0;
u16 sum;
ADC_CSR = channel; //选择通道
ADC_CR2|=0x08; // 数据排列,右对齐
//ADC_TDRL=0x20; //初始化ADC程序
ADC_CR1|=0x01|0x02; //将CR1寄存器的最低位置1开启adc转换,开启连续转换
ADC_CR3|=0X80;
for(k=0;k<200;k++); //延时一段时间,至少7uS,保证ADC模块的上电完成
ADC_CR1|=0x01; //再次将CR1寄存器的最低位置1,开启AD转换
while((ADC_CSR 0x80)!=0x80); // 等待转换结束
//sum = ADC_DR;//直接读取16位数据
ADC_CSR =(~0x80); //软件清零 转换结束 标志位
ADC_CR1 = (~0x03); //停止转换
sum_adc = ADC_DB0R + ADC_DB1R + ADC_DB2R + ADC_DB3R + ADC_DB4R + ADC_DB5R + ADC_DB6R + ADC_DB7R + ADC_DB8R + ADC_DB9R;
sum = sum_adc / 10;
return sum;
}
通过反复试验得到了一个比较好用的带缓存,带平均滤波的ADC读取方法,提供出来给各位参考。各位大侠欢迎拍砖。
u16 adc_trans(u8 channel)
{
u8 k = 0;
u32 sum_adc = 0;
u16 sum;
ADC_CSR = channel; //选择通道
ADC_CR2|=0x08; // 数据排列,右对齐
//ADC_TDRL=0x20; //初始化ADC程序
ADC_CR1|=0x01|0x02; //将CR1寄存器的最低位置1开启adc转换,开启连续转换
ADC_CR3|=0X80;
for(k=0;k<200;k++); //延时一段时间,至少7uS,保证ADC模块的上电完成
ADC_CR1|=0x01; //再次将CR1寄存器的最低位置1,开启AD转换
while((ADC_CSR 0x80)!=0x80); // 等待转换结束
//sum = ADC_DR;//直接读取16位数据
ADC_CSR =(~0x80); //软件清零 转换结束 标志位
ADC_CR1 = (~0x03); //停止转换
sum_adc = ADC_DB0R + ADC_DB1R + ADC_DB2R + ADC_DB3R + ADC_DB4R + ADC_DB5R + ADC_DB6R + ADC_DB7R + ADC_DB8R + ADC_DB9R;
sum = sum_adc / 10;
return sum;
}
举报