stm32双adc电压采集
生活随笔
收集整理的這篇文章主要介紹了
stm32双adc电压采集
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;?? ?//ADC工做模式:ADC同步規(guī)則組模式
ADC_DMACmd(ADC1, ENABLE);? //使能ADC的DMA位
ADC_ExternalTrigConvCmd(ADC2, ENABLE);?? //使能ADC2的外部觸發(fā)模式,用adc1觸發(fā)adc2
#include "adc.h"#include "delay.h"#include "usart.h" #define M 128 #define N 8 uint16_t adcvalue[N][M]; u32 ADC_ConvertedValue; //初始化ADC1 void Adc1_Multi_Init(void) { ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道時(shí)鐘RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設(shè)置ADC分頻因子6 72M/6=12,ADC最大時(shí)間不能超過(guò)14M//PA1 做為模擬通道輸入引腳GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); //復(fù)位ADC1,將外設(shè) ADC1 的所有寄存器重設(shè)為缺省值A(chǔ)DC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC工做模式:ADC1同步規(guī)則組模式ADC_InitStructure.ADC_ScanConvMode =DISABLE; //模數(shù)轉(zhuǎn)換工做在非掃描模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模數(shù)轉(zhuǎn)換工做在單次轉(zhuǎn)換模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動(dòng)ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數(shù)據(jù)右對(duì)齊ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目ADC_Init(ADC1, &ADC_InitStructure); //根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );// 開(kāi)啟ADC的DMA支持ADC_DMACmd(ADC1, ENABLE); //使能ADC的DMA位/* Enable ADC1 */ADC_Cmd(ADC1, ENABLE); //使能ADC1/* Enable ADC1 reset calibaration register 使能ADC1復(fù)位校準(zhǔn)寄存器 */ ADC_ResetCalibration(ADC1);/* Check the end of ADC1 reset calibration register ADC1復(fù)位校準(zhǔn)寄存器檢查結(jié)束*/while(ADC_GetResetCalibrationStatus(ADC1));/* Start ADC1 calibaration 啟動(dòng)ADC1校準(zhǔn) */ADC_StartCalibration(ADC1);/* Check the end of ADC1 calibration ADC1校準(zhǔn)檢查結(jié)束 */while(ADC_GetCalibrationStatus(ADC1));} //初始化ADC2 void Adc2_Multi_Init(void) { ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC2 , ENABLE ); //使能ADC2通道時(shí)鐘RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設(shè)置ADC分頻因子6 72M/6=12,ADC最大時(shí)間不能超過(guò)14M//PB0,1 做為模擬通道輸入引腳GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳GPIO_Init(GPIOC, &GPIO_InitStructure); ADC_DeInit(ADC2); //復(fù)位ADC2,將外設(shè) ADC2 的所有寄存器重設(shè)為缺省值A(chǔ)DC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; //ADC工做模式:ADC1同步規(guī)則組模式ADC_InitStructure.ADC_ScanConvMode =DISABLE; //模數(shù)轉(zhuǎn)換工做在非掃描模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模數(shù)轉(zhuǎn)換工做在單次轉(zhuǎn)換模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動(dòng)ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數(shù)據(jù)右對(duì)齊ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目ADC_Init(ADC2, &ADC_InitStructure); //根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器 ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5 );ADC_ExternalTrigConvCmd(ADC2, ENABLE); //使能ADC2的外部觸發(fā)模式/* Enable ADC2 */ADC_Cmd(ADC2, ENABLE); //使能ADC2/* Enable ADC1 reset calibaration register 使能ADC2復(fù)位校準(zhǔn)寄存器 */ ADC_ResetCalibration(ADC2);/* Check the end of ADC1 reset calibration register ADC2復(fù)位校準(zhǔn)寄存器檢查結(jié)束*/while(ADC_GetResetCalibrationStatus(ADC2));/* Start ADC1 calibaration 啟動(dòng)ADC2校準(zhǔn) */ADC_StartCalibration(ADC2);/* Check the end of ADC1 calibration ADC2校準(zhǔn)檢查結(jié)束 */while(ADC_GetCalibrationStatus(ADC2));}/*初始化ADC */ void MY_ADC_Init(void) {Adc1_Multi_Init();Adc2_Multi_Init();}void task_adc(u16 *value1,u16 *value2)//傳參獲取兩個(gè)值 { int i;*value1=0;*value2=0;printf("\r\n 采樣開(kāi)始\r\n");for(i=0;i<M;i++){/* Start ADC1 Software Conversion 啟動(dòng)ADC1軟件轉(zhuǎn)換 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); //開(kāi)始轉(zhuǎn)換ADC_ConvertedValue=ADC1->DR;adcvalue[0][i] = (ADC_ConvertedValue&0xffff); //獲取ADC的值adcvalue[1][i] = ((ADC_ConvertedValue>> 16)&0xffff); //獲取ADC的值delay_ms(1);*value1=adcvalue[0][2];//也可以取平均值*value2=adcvalue[1][2];}}總結(jié)
以上是生活随笔為你收集整理的stm32双adc电压采集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何批量压缩图片?这两种方法轻松批量压缩
- 下一篇: Linux任务计划详解(crontab、