新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 AD雙通道DMA模式

        STM32 AD雙通道DMA模式

        作者: 時間:2016-11-18 來源:網絡 收藏

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

        本文引用地址:http://www.104case.com/article/201611/315880.htm


        [cpp] view plaincopyprint?
        #include"ad_driver.h"

        //全局變量
        //AD采樣存放空間
        __IOuint16_tADCConvertedValue[20];

        //函數
        //初始化AD
        voidinit_ad(void)
        {
        ADC_InitTypeDefADC_InitStructure;
        DMA_InitTypeDefDMA_InitStructure;
        GPIO_InitTypeDefGPIO_InitStructure;

        //---------------------充電AD初始化--------------------
        //啟動DMA時鐘
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

        //啟動ADC1時鐘
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

        //采樣腳設置
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,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);
        }

        //獲得充電電壓
        floatvoltage_charge(void)
        {
        uint8_ti=0;
        uint16_tsum=0;
        floatv=0;

        //取得10次充電電壓平均值
        for(i=0;i<10;i++)
        {
        sum+=ADCConvertedValue[i*2];
        }
        sum/=10;
        //變換成電壓值
        v=0.002991*sum;

        returnv;
        }

        //獲得放電電壓
        floatvoltage_discharge(void)
        {
        uint8_ti=0;
        uint16_tsum=0;
        floatv=0;

        //取得10次充電電壓平均值
        for(i=0;i<10;i++)
        {
        sum+=ADCConvertedValue[i*2+1];
        }
        sum/=10;
        //變換成電壓值
        v=0.002991*sum;

        returnv;
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 仁布县| 宁德市| 莱西市| 平乐县| 滨州市| 新绛县| 佛坪县| 时尚| 尤溪县| 都匀市| 吴旗县| 游戏| 东丰县| 德惠市| 建瓯市| 台州市| 京山县| 余江县| 曲阳县| 宁强县| 黑水县| 河南省| 承德县| 中西区| 定边县| 莱州市| 南涧| 西安市| 宁波市| 玉溪市| 界首市| 秦安县| 辽源市| 汉源县| 西乌| 历史| 涿鹿县| 紫云| 唐海县| 沽源县| 和顺县|