STM32通过DMA采集多通道AD

发布者:乐呵的挑最新更新时间:2018-05-13 来源: eefocus关键字:STM32  DMA  多通道AD 手机看文章 扫描二维码
随时随地手机看文章

环境:

主机:XP

开发环境:MDK4.23

MCU:STM32F103CBT6


说明:

通过脚PA1,PA2采集AD。每路AD采集10次。

#include "ad_driver.h"  

  

//全局变量  

//AD采样存放空间  

__IO uint16_t ADCConvertedValue[20];  

  

//函数  

//初始化AD  

void init_ad(void)  

{  

    ADC_InitTypeDef ADC_InitStructure;  

    DMA_InitTypeDef DMA_InitStructure;  

    GPIO_InitTypeDef GPIO_InitStructure;  

  

    //---------------------充电AD初始化--------------------  

    //启动DMA时钟  

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  

  

    //启动ADC1时钟  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  

  

    //采样脚设置  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  

    GPIO_Init(GPIOA, &GPIO_InitStructure);  

  

    //DMA1通道1配置  

    DMA_DeInit(DMA1_Channel1);  

    //外设地址  

    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;  

    //内存地址  

    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;  

    //dma传输方向单向  

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  

    //设置DMA在传输时缓冲区的长度  

    DMA_InitStructure.DMA_BufferSize = 20;  

    //设置DMA的外设递增模式,一个外设  

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  

    //设置DMA的内存递增模式  

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  

    //外设数据字长  

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  

    //内存数据字长  

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  

    //设置DMA的传输模式:连续不断的循环模式  

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  

    //设置DMA的优先级别  

    DMA_InitStructure.DMA_Priority = DMA_Priority_High;  

    //设置DMA的2个memory中的变量互相访问  

    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

    DMA_Init(DMA1_Channel1, &DMA_InitStructure);  

      

    //使能通道1  

    DMA_Cmd(DMA1_Channel1, ENABLE);  

  

    //ADC1配置  

    //独立工作模式  

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  

    //扫描方式  

    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 = 2;  

    ADC_Init(ADC1, &ADC_InitStructure);  

      

    //规则模式通道配置  

    ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 1, ADC_SampleTime_239Cycles5);  

    ADC_RegularChannelConfig(ADC1, ADC_Channel_2 , 2, ADC_SampleTime_239Cycles5);  

      

    //使能ADC1的DMA  

    ADC_DMACmd(ADC1, ENABLE);  

      

    //使能ADC1  

    ADC_Cmd(ADC1, ENABLE);  

      

    //使能ADC1复位校准寄存器    

    ADC_ResetCalibration(ADC1);  

    //检查校准寄存器是否复位完毕  

    while(ADC_GetResetCalibrationStatus(ADC1));  

      

    //开始校准  

    ADC_StartCalibration(ADC1);  

    //检测是否校准完毕  

    while(ADC_GetCalibrationStatus(ADC1));  

       

    //开启ADC1的软件转换  

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);  

}  

  

//获得充电电压  

float voltage_charge(void)  

{  

    uint8_t i = 0;  

    uint16_t sum = 0;  

    float v = 0;  

  

    //取得10次充电电压平均值  

    for (i = 0;i < 10;i++)  

    {  

        sum += ADCConvertedValue[i * 2];   

    }  

    sum /= 10;  

    //变换成电压值  

    v = 0.002991 * sum;  

  

    return v;  

}  

  

//获得放电电压  

float voltage_discharge(void)  

{  

    uint8_t i = 0;  

    uint16_t sum = 0;  

    float v = 0;  

  

    //取得10次充电电压平均值  

    for (i = 0;i < 10;i++)  

    {  

        sum += ADCConvertedValue[i * 2 + 1];   

    }  

    sum /= 10;  

    //变换成电压值  

    v = 0.002991 * sum;  

  

    return v;  

}  


关键字:STM32  DMA  多通道AD 引用地址:STM32通过DMA采集多通道AD

上一篇:对于stm32中dma的理解
下一篇:STM32外设DMA使用总结

推荐阅读最新更新时间:2024-03-16 16:02

STM32DMA简介
DMA是MCU一个非常重要的部分,它提供了一种直接、高效、快速的方式来传输数据,而不需要CPU的介入,大大提高了MCU的工作效率。 我们先来看一下没有DMA,数据是怎么流动的。 如图所示,红色线表示外设数据的读写,蓝色线表示内存数据的读写。数据必须要先加载到内核,然后再通过内核写入外设或内存,读写操作都需要内核做很多工作,虽然C代码可能就一行语句,但是汇编可不止一条。我们知道在程序执行的过程中这样的数据传输操作非常频繁,如果都这样处理,内核将花费太多时间在搬运数据上,无法集中精力处理更为重要的计算和中断事件,处理速度和效率就会非常的低。 使用DMA后,数据的流动变成了下图所示方式。 数据的传输工作由DMA控制器接管,假
[单片机]
<font color='red'>STM32</font>的<font color='red'>DMA</font>简介
STM32 输入捕获模式的滤波器设置
一.设置TIMx_CR1的CKD 位,设置时钟分频因子得到fDTS。如下图: 二设置TIMx_CCMR1寄存器的IC1F 位。滤波采样频率和采样次数。如下图 举例:定时器输入时钟频率fCK_INT=72M。CKD =10(B)。IC1F =1111(B)。定时器设置为1通道捕获 fDTS=fCK_IN/4=72M/4=18M 采样频率fSAMPLING = fDTS/32=18M/32=0.5625M 所以滤波的长度=1/fSAMPLING *N=1/0.5625M*8=14.2US。这样捕获通道的滤波器就会滤掉低于14.2us的脉冲干扰 也就是说滤波器会以fSAMPLING的频率采样8次,如果8次都为高电平则确定为上
[单片机]
(纯干货)使用STM32测量频率和占空比的几种方法
使用平台:官方STM32F429DISCOVERY开发板,180MHz的主频,定时器频率90MHz。 相关题目: (1)测量脉冲信号频率f_O,频率范围为10Hz~2MHz,测量误差的绝对值不大于0.1%。(15分) (2)测量脉冲信号占空比D,测量范围为10%~90%,测量误差的绝对值不大于2%。(15分) 思路一:外部中断 思路:这种方法是很容易想到的,而且对几乎所有MCU都适用(连51都可以)。方法也很简单,声明一个计数变量TIM_cnt,每次一个上升沿/下降沿就进入一次中断,对TIM_cnt++,然后定时统计即可。如果需要占空比,那么就另外用一个定时器统计上升沿、下降沿之间的时间即可。 缺点:缺陷显而易见,当频率提高,
[单片机]
(纯干货)使用<font color='red'>STM32</font>测量频率和占空比的几种方法
STM32定时器时间的计算方法
STM32中的定时器有很多用法: (一)系统时钟(SysTick) 设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数: void RCC_Configuration(void) { RCC_ClocksTypeDef RCC_ClockFreq; SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(&RCC_ClockFreq); //SYSTICK分频--1ms的系统时钟中断 if (SysTick_Config(SystemFrequency / 1000)) { while (1); // Capt
[单片机]
STM32单片机的按键检测程序设计
STM32的按键检测相对比较简单,首先按部就班的初始化连接的到的i/o,然后写一个按键扫描函数,这个和51单片机的差不多。 以下是一个比较典型的例子: 利用按键控制LED: key.h文件 #ifndef__KEY_H #define__KEY_H #include“sys.h“ #defineKEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0 #defineKEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1 #defineKEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//读取按键2
[单片机]
<font color='red'>STM32</font>单片机的按键检测程序设计
STM32串口USART通信总结
一、GPIO设置 /**************************************************************************** * Function Name : GPIO_Configuration * Description : * Input : None * Output : None * Return : None ****************************************************************************/ void GPIO_Configuration(void) { RCC_APB2PeriphClo
[单片机]
基于stm32的pwm呼吸灯
这一节的程序所涉及到的硬件是比较简单,主要是考察对stm32时钟的应用 原理性质的东西我就不多说了,参考书目为: 《STM32库开发实战指南》 刘火良,杨森著 《STM32开发指南(库函数版本)》 正点原子著 使用定时器来控制I/O口输出PWM波形,从而驱动LED灯出现类似呼吸频率一般的亮灭。 硬件电路图: 我的收获: 1 这是STM32数据手册上对TIM3通用定时器复用功能重映象的描述,假设让PA6作为PWM输出,从图中可以看出PA6对应TIM3的通道1, 使能TIM3通道1的函数为 TIM_OC1Init();1 同样的,如果想要使能PA7,它对应的是TIM3的通道2,那么使能通道2的函数便是: TIM_OC2Init(
[单片机]
基于<font color='red'>stm32</font>的pwm呼吸灯
STM32系列第16篇--RTC实时时钟
RCT特征: 可编程的预分频系数,分频系数最高2的20次方。 32位可编程计数,用于较长时间段的测量。 2个分离的时钟。 可以选择三种RTC时钟源:HSE/128;LSE振荡器;LSI振荡器。 2个独立的复位类型:APB1由系统复位;RTC由后备域复位。 三个专门的可屏蔽中断:闹钟中断;秒中断(一个可编程周期,最长可达1s);溢出中断。 RTC工作原理框图 RTCCLK经过RTC_DIV预分频,RTC_PRL设置预分频系数,然后得到TR_CLK时钟信号,我们一般设置其周期为1s,RTC_CNT计数器计数,假如1970设置为时间起点为0s,通过当前时间的秒数计算得到当前的时间。RTC_ALR是设置闹钟时间,RTC
[单片机]
<font color='red'>STM32</font>系列第16篇--RTC实时时钟
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved