logo资料库

stm32-adc1-3通道数据采集.docx

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
//adc.h #ifndef ADC_H_MJL #define ADC_H_MJL #include "stm32f10x.h" void adc_gpio_init(void); void adc_dma_init(void); void adc_init(void); void adc_config(void); void adc_start(void); uint16_t get_ChannelVale(uint8_t ADC_Channel); #endif
2013/8/28 Mei Jilin ADC1 的配置完成 3 通道的数据采集 1 ----------- adc_config(); 2 ----------- adc_start(); 3 ----------- get_ChannelValue(ADC_Channel_x); //配置 adc //启动 adc,开始转换 //读取相应通道的 adc 值 //adc.c /** @date @author @brief @attention **/ #include "stm32f10x.h" #include "adc.h" #define CH_NUM 3 //要使用的 ADC 通道数 static uint16_t ad_value[CH_NUM]={0}; /** @para none * @ret none * @brief adc 对应的 gpio 初始化 */ void adc_gpio_init(void) { GPIO_InitTypeDef gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); gpio.GPIO_Mode = GPIO_Mode_AIN; gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&gpio); //配置为模拟输入 //ADC1 --channel0,1,2 } /** @para none * @ret none * @brief adc 配置 */ void adc_init(void) { ADC_InitTypeDef adc; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); 时钟频率为 14M ADC_DeInit(ADC1); adc.ADC_Mode adc.ADC_ContinuousConvMode = ENABLE; adc.ADC_DataAlign = ADC_DataAlign_Right; = ADC_Mode_Independent; //设置 ad 时钟为 72/6=12M,ad 最大 //工作在独立模式 //连续转换模式 //数据右对齐
//转换 3 个通道 //连续转换模式 = CH_NUM ; = ENABLE; = ADC_ExternalTrigConv_None;//不使用外部触发 adc.ADC_ExternalTrigConv adc.ADC_NbrOfChannel adc.ADC_ScanConvMode ADC_Init(ADC1,&adc); //设定指定的 ADC 通道组,设置转化顺序和采样时间 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //开启 adc 的 DMA ADC_DMACmd(ADC1,ENABLE); //使能 ADC1 ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); //重新校准 /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); //等待重新校准完成 //等待校准完成 //开始校准 } /** @para none * @ret none * @brief 配置 dma */ void adc_dma_init() { DMA_InitTypeDef dma; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel1); dma.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR); = (u32)&ad_value; dma.DMA_MemoryBaseAddr dma.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA 的转换模式为 SRC 模式,由外设 //DMA 对应的外设基地址 //内存存储基地址 搬移到内存 dma.DMA_M2M dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度为 16 位 dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; = DMA_M2M_Disable; //M2M 模式禁用 //DMA 搬 移 数 据 尺 寸 , HalfWord 就是为 16 位 dma.DMA_BufferSize dma.DMA_MemoryInc = CH_NUM; = DMA_MemoryInc_Enable; //DMA 缓存大小 CH_NUM 个 //接收一次数据后,目标内 存地址后移 dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //接收一次数据后,设备地址禁止
后移 dma.DMA_Mode dma.DMA_Priority DMA_Init(DMA1_Channel1,&dma); = DMA_Mode_Circular; = DMA_Priority_High; //转换模式,循环缓存模式。 //DMA 优先级高 /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); //连续转换开始,ADC 通过 DMA 方式不断的更新 RAM } /** @para none * @ret none * @brief 完成 adc 配置 */ void adc_config(void) { adc_gpio_init(); adc_dma_init(); adc_init(); } /** @para none * @ret none * @brief 启动 adc,开始转换 */ void adc_start(void) { 区。 } DMA_Cmd(DMA1_Channel1,ENABLE); /** @para ADC_Channel --- (ADC_Channel0 ~ ADC_Channel17) * @ret ADC_Channel_x 的 ADC 值 */ uint16_t get_ChannelVale(uint8_t ADC_Channel) { uint16_t ret = 0; switch(ADC_Channel) { case ADC_Channel_0: ret = ad_value[0]; break; case ADC_Channel_1: ret = ad_value[1]; break; case ADC_Channel_2: ret = ad_value[2]; break;
} return ret; } //main.c /** @date * @author * @brief **/ #include "led.h" #include #include "delay.h" #include "adc.h" uint16_t buffer[3]; int main(void) { led_init(); delay_init(72);//72M adc_config(); adc_start(); while(1) { 2013/8/28 Mei Jilin ADC1 数据测试 delay_ms(100); led_toggle(); buffer[0] = get_ChannelVale(ADC_Channel_0); buffer[1] = get_ChannelVale(ADC_Channel_1); buffer[2] = get_ChannelVale(ADC_Channel_2); } } /******************* (C) COPYRIGHT 2012*****END OF FILE****/
分享到:
收藏