新手上路
- 积分
- 47
- 金钱
- 47
- 注册时间
- 2013-1-24
- 在线时间
- 0 小时
|
发表于 2013-3-9 10:01:00
|
显示全部楼层
回复【9楼】正点原子:
---------------------------------
void Adc_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA口时钟 ADC4,5,6
GPIOA->CRL&=0XF000FFFF;//PA.4,5,6 anolog输入
RCC->APB2ENR|=1<<9; //ADC1时钟使能
__nop();
__nop();
RCC->APB2RSTR|=1<<9; //ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR|=3<<14; //SYSCLK/DIV2=72M/8=9Mhz 得到ADC采样率位43.65Khz
ADC1->CR1&=0XF0FFFF; //独立工作模式
ADC1->CR1|=1<<8; //扫描模式
ADC1->CR2|=1<<1; //连续转换模式
ADC1->CR2|=0x000E0000; //软件控制转换 由bit21控制 SWSTART控制
ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
ADC1->CR2&=~(1<<11); //右对齐
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=1<<21; //3个转换在规则序列中
*** ADC1->SQR3&=0XFFFF8000;//规则序列 通道ch
*** ADC1->SQR3|=0X0000A50A; //10 8 9
ADC1->SMPR2&=0XFE00FFFF; //通道4,5,6的转换时间为:239.5+12.5个ADC时钟周期
ADC1->SMPR2|=0xFFFFFFFF; //通道4,5,6 239.5周期,提高采样时间可以提高精确度
ADC1->CR2|=1<<0; //开启AD转换器,第一次唤醒AD转换器
ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。
ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待校准结束
//该位由软件设置以开始校准,并在校准结束时由硬件清除
}
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{
//设置转换序列
*** ADC1->SQR3&=0XFFFFFC00;//规则序列1 通道ch
*** ADC1->SQR3|=0X0000010A; //8 10
ADC1->CR2|=1<<22; //启动规则转换通道
while(!(ADC1->SR&1<<1));//等待转换结束
return ADC1->DR; //返回adc值
}
两处标有***的地方不是很理解,上面和下面的作用没区分清楚,请帮忙,谢谢 |
|