这儿的ADC转化也来运用DMA—这个也是STM32的ADC转化最常见的方法。
第一步是了解STM32的ADC对应的GPIO口如下图不必记住,能够查询,我是将它剪下来粘贴到书本的相应章节!
第二步是装备相应ADC转化的GPIO口这儿运用PC0–PC1
staTIc void ADC1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //翻开DMA1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 “ RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模仿输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
第三步是-装备ADC的DMA装备ADC通道等—
#define ADC1_DR_Address ((u32)0x40012400+0x4c) //外设地址
__IO uint16_t ADC_ConvertedValue[2];//内存数组
staTIc void ADC1_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_DeInit(DMA1_Channel1);
//—————ADC的DMA装备——————–
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC1地址—代表ADC1保存转化值的寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//内存地址—用来保存DMA传输过来的ADC转化值—-后边直接运用的变量地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设为数据源
DMA_InitStructure.DMA_BufferSize = 2; //传输总数据—2通道需求传输2个数据
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增—整体表明一直从外设ADC1地址处取值—顺次保存到接连的两个内存变量中—
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设传输数据单元—半字16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存传输数据单元—半字16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环形式—2个数据顺次循环接纳从外设ADC1传输过来的ADC值—
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //制止内存传内存
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE); //再次翻开DMA1
//————ADC形式装备————————
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立形式—-还有许多形式—这个比较常见
ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //扫描形式—收集多通道运用—-本程序收集2通道—所以扫描形式
ADC_InitStructure.ADC_ConTInuousConvMode = ENABLE; //接连转化形式—不难理解—便是不停地收集—一次接一次
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不运用外部触发转化—触发分为外部触发—比方中止与定时器。软件触发—后边有专用函数
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //收集的数据右对齐—便利核算
ADC_InitStructure.ADC_NbrOfChannel = 2; //一共需求转化的通道个数—这儿2个
ADC_Init(ADC1, &ADC_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div8); //装备ADC转化时钟—PCLK2的8分频
//下面这个函数比较重要—-装备ADC的通道与采样周期—前面说的PC0与PC1对应的ADC通道分别是–10与11。收集周期也有几种。
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTIme_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);
ADC_DMACmd(ADC1, ENABLE); //翻开DMA1的ADC1
ADC_Cmd(ADC1, ENABLE); //翻开ADC1
ADC_ResetCalibration(ADC1); //复位校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等候校准寄存器复位完结
ADC_StartCalibration(ADC1);//ADC校准
while(ADC_GetCalibrationStatus(ADC1));//校准完结
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发转化
}
—第四部分是—在硬件上运用了一个通道切换芯片—-CD4052—-由PC2—PC3操控通道的挑选CD4052切换操控GPIO装备—-
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推完输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
—第五部分是—主函数—–
extern __IO uint16_t ADC_ConvertedValue[2];//声明外部变量
uint16_t My_ADC[2]; //求平均值
int main(void)
{
u8 i,led=0x01;
USART1_Config();
ADC1_GPIO_Config();
ADC1_Mode_Config();
while (1)
{
My_ADC[0]=0;
My_ADC[1]=0;
for(i=0;i《10;i++)
{
My_ADC[0]+=ADC_ConvertedValue[0];
My_ADC[1]+=ADC_ConvertedValue[1];
}
My_ADC[0]=My_ADC[0]/10; //收集10次求平均值
My_ADC[1]=My_ADC[1]/10;
ADC_ConvertedValueLocal =(float) My_ADC[0]/4096*3.3; //转化为电压值
printf(”\r\n The current AD—0 value = 0x%04X \n“, My_ADC[0]);
printf(”The current AD—0 value = %f V \n“,ADC_ConvertedValueLocal);
ADC_ConvertedValueLocal =(float) My_ADC[1]/4096*3.3;
printf(”The current AD—1 value = 0x%04X \n“, My_ADC[1]);
printf(”The current AD—1 value = %f V \n“,ADC_ConvertedValueLocal);
}
}