×
单片机 > 单片机程序设计 > 详情

STM32通过DMA采集多通道AD

发布时间:2020-07-08 发布时间:
|

环境:

主机:XP

开发环境:MDK4.23

MCU:STM32F103CBT6


说明:

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


源代码:



  1. #include "ad_driver.h"  

  2.   

  3. //全局变量  

  4. //AD采样存放空间  

  5. __IO uint16_t ADCConvertedValue[20];  

  6.   

  7. //函数  

  8. //初始化AD  

  9. void init_ad(void)  

  10. {  

  11.     ADC_InitTypeDef ADC_InitStructure;  

  12.     DMA_InitTypeDef DMA_InitStructure;  

  13.     GPIO_InitTypeDef GPIO_InitStructure;  

  14.   

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

  16.     //启动DMA时钟  

  17.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  

  18.   

  19.     //启动ADC1时钟  

  20.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  

  21.   

  22.     //采样脚设置  

  23.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  

  24.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;  

  25.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  

  26.     GPIO_Init(GPIOA, &GPIO_InitStructure);  

  27.   

  28.     //DMA1通道1配置  

  29.     DMA_DeInit(DMA1_Channel1);  

  30.     //外设地址  

  31.     DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_ADDRESS;  

  32.     //内存地址  

  33.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;  

  34.     //dma传输方向单向  

  35.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  

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

  37.     DMA_InitStructure.DMA_BufferSize = 20;  

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

  39.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  

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

  41.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  

  42.     //外设数据字长  

  43.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  

  44.     //内存数据字长  

  45.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  

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

  47.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  

  48.     //设置DMA的优先级别  

  49.     DMA_InitStructure.DMA_Priority = DMA_Priority_High;  

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

  51.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  

  52.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);  

  53.       

  54.     //使能通道1  

  55.     DMA_Cmd(DMA1_Channel1, ENABLE);  

  56.   

  57.     //ADC1配置  

  58.     //独立工作模式  

  59.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  

  60.     //扫描方式  

  61.     ADC_InitStructure.ADC_ScanConvMode = ENABLE;  

  62.     //连续转换  

  63.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  

  64.     //外部触发禁止  

  65.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  

  66.     //数据右对齐  

  67.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  

  68.     //用于转换的通道数  

  69.     ADC_InitStructure.ADC_NbrOfChannel = 2;  

  70.     ADC_Init(ADC1, &ADC_InitStructure);  

  71.       

  72.     //规则模式通道配置  

  73.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1 , 1, ADC_SampleTime_239Cycles5);  

  74.     ADC_RegularChannelConfig(ADC1, ADC_Channel_2 , 2, ADC_SampleTime_239Cycles5);  

  75.       

  76.     //使能ADC1的DMA  

  77.     ADC_DMACmd(ADC1, ENABLE);  

  78.       

  79.     //使能ADC1  

  80.     ADC_Cmd(ADC1, ENABLE);  

  81.       

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

  83.     ADC_ResetCalibration(ADC1);  

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

  85.     while(ADC_GetResetCalibrationStatus(ADC1));  

  86.       

  87.     //开始校准  

  88.     ADC_StartCalibration(ADC1);  

  89.     //检测是否校准完毕  

  90.     while(ADC_GetCalibrationStatus(ADC1));  

  91.        

  92.     //开启ADC1的软件转换  

  93.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);  

  94. }  

  95.   

  96. //获得充电电压  

  97. float voltage_charge(void)  

  98. {  

  99.     uint8_t i = 0;  

  100.     uint16_t sum = 0;  

  101.     float v = 0;  

  102.   

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

  104.     for (i = 0;i 

  105.     {  

  106.         sum += ADCConvertedValue[i * 2];   

  107.     }  

  108.     sum /= 10;  

  109.     //变换成电压值  

  110.     v = 0.002991 * sum;  

  111.   

  112.     return v;  

  113. }  

  114.   

  115. //获得放电电压  

  116. float voltage_discharge(void)  

  117. {  

  118.     uint8_t i = 0;  

  119.     uint16_t sum = 0;  

  120.     float v = 0;  

  121.   

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

  123.     for (i = 0;i 

  124.     {  

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

  126.     }  

  127.     sum /= 10;  

  128.     //变换成电压值  

  129.     v = 0.002991 * sum;  

  130.   

  131.     return v;  

  132. }  




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析