1. 程式人生 > >STM32通過DMA採集多通道AD

STM32通過DMA採集多通道AD

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

STM32通過DMA採集多通道AD


本文部落格連結:http://blog.csdn.net/jdh99,作者:jdh,轉載請註明.

 

環境:

主機:XP

開發環境:MDK4.23

MCU:STM32F103CBT6


說明:

通過腳PA1,PA2採集AD。每路AD採集10次。

參考連結:http://hi.baidu.com/kangxuebin/item/f4f4370f9d7f3c123a53ee30


原始碼:

#include "ad_driver.h"//全域性變數//AD取樣存放空間__IO uint16_t ADCConvertedValue[20];//函式//初始化ADvoid 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 = 0uint16_t sum = 0float 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 = 0uint16_t sum = 0float v = 0//取得10次充電電壓平均值 for (i = 0;i < 10;i++) {   sum += ADCConvertedValue[i * 2 + 1];  } sum /= 10//變換成電壓值 v = 0.002991 * sum; return v;}




           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述