新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 經典_STM32_ADC多通道采樣的例子

        經典_STM32_ADC多通道采樣的例子

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



        ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1

        ADC_ResetCalibration(ADC1); //復位指定的ADC1的校準寄存器

        while(ADC_GetResetCalibrationStatus(ADC1)); //獲取ADC1復位校準寄存器的狀態,設置狀態則等待


        ADC_StartCalibration(ADC1); //開始指定ADC1的校準狀態

        while(ADC_GetCalibrationStatus(ADC1)); //獲取指定ADC1的校準程序,設置狀態則等待


        }


        void DMA_Configuration(void)
        {

        DMA_InitTypeDef DMA_InitStructure;
        DMA_DeInit(DMA1_Channel1); //將DMA的通道1寄存器重設為缺省值
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA外設ADC基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; //DMA內存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //內存作為數據傳輸的目的地
        DMA_InitStructure.DMA_BufferSize = N*M; //DMA通道的DMA緩存的大小
        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_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x擁有高優先級
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x沒有設置為內存到內存傳輸
        DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根據DMA_InitStruct中指定的參數初始化DMA的通道

        }


        //配置所有外設
        void Init_All_Periph(void)
        {

        RCC_Configuration();

        GPIO_Configuration();

        ADC1_Configuration();

        DMA_Configuration();

        //USART1_Configuration();
        USART_Configuration(9600);


        }



        u16 GetVolt(u16 advalue)

        {

        return (u16)(advalue * 330 / 4096); //求的結果擴大了100倍,方便下面求出小數

        }




        void filter(void)
        {
        int sum = 0;
        u8 count;
        for(i=0;i<12;i++)

        {

        for ( count=0;count
        {

        sum += AD_Value[count][i];

        }

        After_filter[i]=sum/N;

        sum=0;
        }

        }




        int main(void)
        {

        u16 value[M];

        init_All_Periph();
        SysTick_Initaize();


        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        DMA_Cmd(DMA1_Channel1, ENABLE); //啟動DMA通道
        while(1)
        {
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待傳輸完成否則第一位數據容易丟失

        filter();
        for(i=0;i<12;i++)
        {
        value[i]= GetVolt(After_filter[i]);

        printf("value[%d]:t%d.%dvn",i,value[i]/100,value[i]0) ;
        delay_ms(100);
        }
        }

        }
        總結
        該程序中的兩個宏定義,M和N,分別代表有多少個通道,每個通道轉換多少次,可以修改其值。
        曾出現的問題:配置時鐘時要知道外部晶振是多少,以便準確配置時鐘。將轉換值由二進制轉換為十進制時,要先擴大100倍,方便顯示小數。最后串口輸出時在 printf語句之前加這句代碼,防止輸出的第一位數據丟失:while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

        上一頁 1 2 下一頁

        關鍵詞: STM32ADC多通道采

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 万年县| 仁化县| 昆山市| 株洲市| 开封县| 土默特右旗| 诏安县| 灌南县| 新和县| 屏南县| 曲麻莱县| 阿鲁科尔沁旗| 博湖县| 长宁县| 玉树县| 徐水县| 高雄县| 龙里县| 阳山县| 静安区| 万荣县| 防城港市| 霞浦县| 通道| 登封市| 伊宁市| 莱西市| 临沧市| 宝应县| 麻城市| 元江| 松原市| 和平县| 台湾省| 康平县| 平陆县| 晋城| 古交市| 山西省| 翼城县| 清水河县|