您的位置 首页 电源

STM32的ADC编程办法总结

STM32的ADC编程方法总结-这里的ADC转换也来使用DMA—这个也是STM32的ADC转换最常见的方式。

第一步是了解STM32的ADC对应的GPIO口如下图不用记住,可以查询,我是将它剪下来粘贴到书本的相应章节!

这儿的ADC转化也来运用DMA—这个也是STM32ADC转化最常见的方法。

第一步是了解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);

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/346692.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部