完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F407+ADC多通道+DMA
单缓冲模式的ADC+DMA操作通过 407主频168MHZ该监听采集了8路AD数据,每次路采集100组数据,然后进行平均处理,当然也可以加入卡尔曼滤波,采集会更准确,ADC采集的卡尔曼滤波有很多。 基础配置 GPIO对应表 PA0——》 ADC123_IN0 PA1 ——》 ADC123_IN1 PB0 ——》 ADC12_IN8 PB1 ——》 ADC12_IN9 PC1 ——》 ADC12_IN11 PC2 ——》 ADC123_IN12 PC4 ——》 ADC12_IN14 PC5 ——》 ADC12_IN15 void RCC_Configuration() { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC |RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF |RCC_AHB1Periph_CRC | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_DMA1 , 使能够); RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG | RCC_APB1Periph_SPI2 | RCC_APB1Periph_SPI3 |RCC_APB1Periph_USART2 |RCC_APB1Periph_USART3| RCC_APB1Periph_TIM2 ,启用); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_ADC1| RCC_APB2Periph_TIM9 | RCC_APB2Periph_SPI1 | RCC_APB2Periph_SYSCFG| RCC_APB1Periph_USART2 | RCC_APB2Periph_USART6 ,ENABLE); } void GPIO_Config(void) { //AD 样本---------------------------------------------- —— GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); } ADC配置 #define ADC_SAMPLE_PNUM 100//AD采样点数100 #define ADC_SAMPLE_CNUM 8//AD采样数 volatile unsigned short m_ADCValue[ADC_SAMPLE_PNUM][ADC_SAMPLE_CNUM] = {0}; void ADC_Config_Conver(无效) { DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; DMA_Cmd(DMA2_Stream0,禁用); DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (unsigned int)&(ADC1-》DR); DMA_InitStructure.DMA_Memory0BaseAddr = (unsigned int)&m_ADCValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = ADC_SAMPLE_PNUM*ADC_SAMPLE_CNUM; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStructure); // //双缓冲模式设置 // DMA_DoubleBufferModeConfig(DMA2_Stream0,(uint32_t)(u16 *)(m_ADCValue1),DMA_Memory_0); //DMA_Memory_0首先被传输 // DMA_DoubleBufferModeCmd(DMA2_Stream0,ENABLE); ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;//预分频 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;//采样间隔 ADC_CommonInit(&ADC_CommonInitStructure); /* ADC1 初始化 ************************************************ ********************/ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ExternalTrigConv = 0; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = ADC_SAMPLE_CNUM; ADC_Init(ADC1, &ADC_InitStructure); ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); ADC_DMACmd(ADC1,使能); ADC_Cmd(ADC1,使能); DMA_Cmd(DMA2_Stream0,启用); ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_480Cycles); ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_480Cycles); ADC_RegularChannelConfig(ADC1,ADC_Channel_8,3,ADC_SampleTime_480Cycles); ADC_RegularChannelConfig(ADC1,ADC_Channel_9,4,ADC_SampleTime_480Cycles); ADC_RegularChannelConfig(ADC1,ADC_Channel_15,5,ADC_SampleTime_480Cycles); ADC_RegularChannelConfig(ADC1,ADC_Channel_14,6,ADC_SampleTime_480Cycles); ADC_RegularChannelConfig(ADC1,ADC_Channel_11,7,ADC_SampleTime_480Cycles); ADC_RegularChannelConfig(ADC1,ADC_Channel_12,8,ADC_SampleTime_480Cycles); ADC_SoftwareStartConv(ADC1); } 读取数据 u16 ADC_Proc_Value(unsigned char nIndex) { u32 nValue = 0; u32 nSum = 0; u8 i = 0, j = 0; u16 温度 = 0; u16 tempArray[ADC_SAMPLE_PNUM] = {0}; 对于(i=0; i《ADC_SAMPLE_PNUM; i++)//采集10组 { tempArray[i] = m_ADCValue[i][nIndex]; // printf(“ttt******ADCValue:%Xrn”,tempArray[i]); } 对于(i=0; i《ADC_SAMPLE_PNUM-1; i++) // 去掉视角 { 对于(j = i+1; j《 ADC_SAMPLE_PNUM ;j++){ if(tempArray[j] 《 tempArray[i]) { Temp = tempArray[i]; tempArray[i] = tempArray[j]; tempArray[j] = Temp; } } } 对于(i=10; i《ADC_SAMPLE_PNUM-10; i++) //取调试调试 { nSum += tempArray[i] ; } nValue = nSum / (ADC_SAMPLE_PNUM-20);//调试 返回 nValue; } int main(空) { 整数总和; u8 i,j; RCC_配置(); GPIO_Config(); float ADC_Value[ADC_SAMPLE_CNUM];//保存经过转换得到的电压值 ADC_Config_Conver(); 同时(1) { 对于(i=0; i《ADC_SAMPLE_CNUM ; 我++) { ADC_Value[i]=ADC_Proc_Value(i);//求娇并转换成电压值 ADC_Value[i]=(float)(ADC_Value[i]/4096)*3.3;//求急性并转换成电压值 printf(“ADC_Value[d%]:%.2frn”, i, ADC_Value[i]); } } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 21:21 , Processed in 0.749811 second(s), Total 48, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号