//--------------------------------------------------------------------------------------------------
// STM32 ADC相关定义
//--------------------------------------------------------------------------------------------------
#define ADC_SAMP_CYC ADC_Samp_41Cyc5 // ADC采样周期28.5
/***************************************************************************************************
* 函数名称: stm32_ADCSetup()
* 函数功能: STM32 ADC初始化设置,PA1 ~ PA6为模拟输入
* 入口参数: 无
* 出口参数: 无
* 使用说明:初始化ADC相关寄存器,ADC时钟为11.0592MHz
* 创建日期: 2010年08月09日
***************************************************************************************************/
__inline static void stm32_ADCSetup(void)
{
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN; // ADC1、ADC2时钟使能
Delay(20); // 增加一定延时,等待时钟使能完成
RCC->APB2RSTR |= RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN; // 复位ADC1、ADC2
Delay(20);
RCC->APB2RSTR &= (~RCC_APB2ENR_ADC1EN) & (~RCC_APB2ENR_ADC2EN); // 复位结束
Delay(20);
// AIN0作为电压输入,16倍过采样
ADC1->CR1 = 0x00060100; // 规则同步模式、使用扫描方式、禁止产生EOC中断
ADC1->CR2 = 0x001E0000; // 规则通道软件触发、右对齐、不使用DMA、关闭ADC1转换
ADC1->SQR1 = (ADC_Chl_0)|(ADC_Chl_0 << 5)|(ADC_Chl_0 << 10)|(ADC_Chl_0 << 15)|(0x0F << 20);
ADC1->SQR2 = (ADC_Chl_0)|(ADC_Chl_0 << 5)|(ADC_Chl_0 << 10)|(ADC_Chl_0 << 15)|(ADC_Chl_0 << 20)|(ADC_Chl_0 << 25);
ADC1->SQR3 = (ADC_Chl_0)|(ADC_Chl_0 << 5)|(ADC_Chl_0 << 10)|(ADC_Chl_0 << 15)|(ADC_Chl_0 << 20)|(ADC_Chl_0 << 25);
// AIN1作为电流输入,16倍过采样
ADC2->CR1 = 0x00000100;
ADC2->CR2 = 0x001E0000;
ADC2->SQR1 = (ADC_Chl_2)|(ADC_Chl_2 << 5)|(ADC_Chl_2 << 10)|(ADC_Chl_2 << 15)|(0x0F << 20);
ADC2->SQR2 = (ADC_Chl_2)|(ADC_Chl_2 << 5)|(ADC_Chl_2 << 10)|(ADC_Chl_2 << 15)|(ADC_Chl_2 << 20)|(ADC_Chl_2 << 25);
ADC2->SQR3 = (ADC_Chl_2)|(ADC_Chl_2 << 5)|(ADC_Chl_2 << 10)|(ADC_Chl_2 << 15)|(ADC_Chl_2 << 20)|(ADC_Chl_2 << 25);
// 设置通道0 ~ 1的采样时间,41.5 + 12.5个周期 fadc = 11059.200 / 54 = 204.8 KHz
ADC1->SMPR2 = (ADC_SAMP_CYC) | (ADC_SAMP_CYC << 3);
ADC2->SMPR2 = (ADC_SAMP_CYC) | (ADC_SAMP_CYC << 3);
ADC1->CR2 |= ADC_CR2_ADON; // 开启AD转换器,上电时间最大1uS
ADC2->CR2 |= ADC_CR2_ADON;
Delay(1000);
ADC1->CR2 |= ADC_CR2_RSTCAL; // 使能ADC1、ADC2复位校准寄存器
ADC2->CR2 |= ADC_CR2_RSTCAL;
while(ADC1->CR2 & ADC_CR2_RSTCAL); // 等待复位结束
while(ADC2->CR2 & ADC_CR2_RSTCAL);
Delay(1000);
ADC1->CR2 |= ADC_CR2_CAL; // 开启ADC1、ADC2校准
ADC2->CR2 |= ADC_CR2_CAL;
while(ADC1->CR2 & ADC_CR2_CAL); // 等待校准结束
while(ADC2->CR2 & ADC_CR2_CAL);
Delay(1000);
ADC1DMAEnable();
}
|