TA的每日心情 | 无聊 2020-7-7 14:50 |
---|
签到天数: 284 天 连续签到: 1 天 [LV.8]以坛为家I
|
STM32F103ZET6芯片,采集6个通道的数据,每次复位后第一次采集的数据中有3个通道的数据出错,数据特别大,其它3个通道的数据正常,什么原因呢?
ADC初始化代码如下:
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR |= 1 << 4; //使能PORTC口时钟
GPIOC->CRL &= 0xFFFF0000; //PC0-3 模拟输入模式
RCC->APB2ENR |= 1 << 9; //ADC1时钟使能
RCC->APB2RSTR |= 1 << 9; //ADC1复位
RCC->APB2RSTR &= ~(1 << 9); //复位结束
//SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降!
RCC->CFGR &= ~(3 << 14);
RCC->CFGR |= 2 << 14; //bit14-15ADCPRE ADC预分频 0-2分频 1-4分频 2-6分频 3-8分频
ADC1->CR1 &= 0xF0FFFF; //工作模式清零
ADC1->CR1 |= 0 << 16; //bit16-19 0000-独立工作模式
ADC1->CR1 &= ~(1 << 8); //bit8-SCAN 0-关闭扫描模式 1-使用扫描模式
ADC1->CR2 &= ~(1 << 1); //bit1-CONT 0-单次转换模式 1-连续转换模式
ADC1->CR2 &= ~(7 << 17);
ADC1->CR2 |= 7 << 17; //bit17-19 111-软件控制转换
ADC1->CR2 |= 1 << 20; //bit20-EXTTRIG 1-使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
ADC1->CR2 &= ~(1 << 11); //bit11-ALIGN 0-右对齐 1-左对齐
ADC1->CR2 |= 1 << 23; //bit23-TSVREFE 温度传感器和VREFINT使能 0-禁止 1-启用
ADC1->SQR1 &= ~(0xF << 20);
ADC1->SQR1 |= 0 << 20; //bit20-23规则通道序列长度 0:1个转换在规则序列中 也就是只转换规则序列1
//设置采样时间
ADC1->SMPR1 = ( (7 << (3 * 0)) | //通道10 239.5周期,提高采样时间可以提高精确度
(7 << (3 * 1)) | //通道11 239.5周期,提高采样时间可以提高精确度
(7 << (3 * 2)) | //通道12 239.5周期,提高采样时间可以提高精确度
(7 << (3 * 3)) | //通道13 239.5周期,提高采样时间可以提高精确度
(7 << (3 * 6)) | //通道16 239.5周期,提高采样时间可以提高精确度
(7 << (3 * 7))); //通道17 239.5周期,提高采样时间可以提高精确度
ADC1->CR2 |= 1 << 0; //bit0-ADON 开启AD转换器
ADC1->CR2 |= 1 << 3; //bit3-RSTCAL 使能复位校准
while(ADC1->CR2 & (1 << 3)); //等待校准结束(该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除)
ADC1->CR2 |= 1 << 2; //bit2-CAL 开启AD校准
while(ADC1->CR2 & (1 << 2)); //等待校准结束(该位由软件设置以开始校准,并在校准结束时由硬件清除)
}
|
|