文档详情

stm32多通道ad转换

第***
实名认证
店铺
DOCX
15.06KB
约4页
文档ID:31364549
stm32多通道ad转换_第1页
1/4

关于 AD 多通道采集的总结前几天小试了下,用 STM32 做了个万用表,采集电压电流电阻并液晶显示期间遇到一个最大的问题应该就是,要开启多个 AD 通道,结合 DMA 传输,小结下下面是我对 AD 的配置,还有 DMAvoidDMA_ADC_Config(){/*DMAchannel1configuration----------------------------------------------*/DMA_DeInit(DMA_Channel1);//复位 DMA 通道 xDMA_InitStructure.DMA_PeripheralBaseAddr=ADC_DR_Address;//定义 DMA 通道外设基地址=ADC1_DR_Address 源//AD 采集到的数据存放的寄存器DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADC_RegularConvertedValueTab;//定义 DMA 通道存储器地址,内存中的数据目的DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//指定外设为源地址DMA_InitStructure.DMA_BufferSize=4;//定义 DMA 缓冲区大小 4,4 路 AD,最后采集到的数值放在 4 位数组中DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//当前外设寄存器地址不变DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//当前存储器地址递增DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度 16 位DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//定义存储器数据宽度 16 位DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//DMA 通道操作模式位环形缓冲模式DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA 通道优先级高DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//禁止 DMA 通道存储器到存储器传输DMA_Init(DMA_Channel1,//初始化 DMA 通道 1DMA_Cmd(DMA_Channel1,ENABLE);//使能 DMA 通道 1}voidADC1_config(){/*ADC1configuration------------------------------------------------------*/ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//AD 转换模式ADC_InitStructure.ADC_ScanConvMode=ENABLE;//使能扫描,多通道ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//连续转换ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;;//有软件控制转换ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_NbrOfChannel=4;//转换通道为通道 4,4 个通道来回扫描ADC_Init(ADC1,/*ADC1regularchannel14configuration*///ADC1 选择信道 14|15,采集次序 1,采样时间 55.5 个周期ADC_RegularChannelConfig(ADC1,ADC_Channel_14,1,ADC_SampleTime_55Cycles5);//通道 14,PC4 扫面顺序 1ADC_RegularChannelConfig(ADC1,ADC_Channel_15,2,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_6,3,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_4,4,ADC_SampleTime_55Cycles5);}DMA 其实开一个就够了,它可以定义缓冲区大小,然后配置成DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//当前存储器地址递增这样就可以传递多个数据,我是定义了一个数组vu16ADC_RegularConvertedValueTab[4];AD 采集到的值放在寄存器 ADC_DR_Address((u32)0x4001244C)中,每次采集好后 DMA 把数据取到数组中,接下去配置 AD 的时候采用扫描模式ADC_InitStructure.ADC_ScanConvMode=ENABLE;//使能扫描,多通道多个通道在下面开启,并配置顺序ADC_RegularChannelConfig(ADC1,ADC_Channel_14,1,ADC_SampleTime_55Cycles5);//通道 14,PC4 扫面顺序 1ADC_RegularChannelConfig(ADC1,ADC_Channel_15,2,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_6,3,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_4,4,ADC_SampleTime_55Cycles5);这样 AD 就来回采集通道 141564 结合 DMA 后把数据存在刚才定义的数组中。

以上是心得,下面是一些疑问1.在配置 GPIO 的时候我把 AD 口配成了输出模式,但是后来我把这段注释掉,采集还是一样没错误难道可以不用配的?2.AD 有两个大的模式,一个是规则一个是注入,看了很久还是不明白这两个到底具体各代表什么3.学习板光盘上面的 DEMO 烧进去,好像一直跳的很厉害,不知道如何才能稳下来,我是采用多次取值采用平均值,效果还可以,但是好像比较耗资源。

下载提示
相似文档
正为您匹配相似的精品文档