STM32 —— 多路ADC采集
来源:互联网 发布:淘宝813 编辑:程序博客网 时间:2024/06/05 03:02
#ifndef _ADC_H_#define _ADC_H_#include "type.h"#include "debug.h"void ADCInit(void);uint16_t ADCGetData(uint8_t channel);uint16_t ADCGetAverage(uint8_t channel, uint8_t times);#ifndef CONFIG_CANvoid adc_test(void);#endif#endif /* _ADC_H_ */
// input1~5 -- 模拟量IO口; input6~10 -- 普通IO口用#define ADC_CHANNEL ADC1#define AD_INPUT1_GRP GPIOC#define AD_INPUT1_INDEX GPIO_Pin_0#define AD_INPUT2_GRP GPIOC#define AD_INPUT2_INDEX GPIO_Pin_1#define AD_INPUT3_GRP GPIOC#define AD_INPUT3_INDEX GPIO_Pin_2#define AD_INPUT4_GRP GPIOC#define AD_INPUT4_INDEX GPIO_Pin_3#define AD_INPUT5_GRP GPIOA#define AD_INPUT5_INDEX GPIO_Pin_2#if 0#define AD_INPUT6_GRP GPIOA#define AD_INPUT6_INDEX GPIO_Pin_3#define AD_INPUT7_GRP GPIOC#define AD_INPUT7_INDEX GPIO_Pin_4#define AD_INPUT8_GRP GPIOC#define AD_INPUT8_INDEX GPIO_Pin_5#define AD_INPUT9_GRP GPIOB#define AD_INPUT9_INDEX GPIO_Pin_0#define AD_INPUT10_GRP GPIOB#define AD_INPUT10_INDEX GPIO_Pin_1#endif#define AD_INPUT_CONFIG(gpio, pos) GPIOConfig(gpio, pos, GPIO_Mode_AIN)
#include "adc.h"#include "stm32f10x.h"#include "delay.h"#include "target.h"#define ADC_CHANNEL_NUM 5static uint16_t ad_value[ADC_CHANNEL_NUM] = {0};static void adc_gpio_clk_init(void){ RCC_ADCCLKConfig(RCC_PCLK2_Div6);}static void adc_gpio_init(void){ adc_gpio_clk_init(); AD_INPUT_CONFIG(AD_INPUT1_GRP, AD_INPUT1_INDEX | AD_INPUT2_INDEX | AD_INPUT3_INDEX | AD_INPUT4_INDEX); AD_INPUT_CONFIG(AD_INPUT5_GRP, AD_INPUT5_INDEX); ADC_DeInit(ADC_CHANNEL);}static void adc_dma_init(void){ DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) & (ADC1->DR); DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ad_value; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_BufferSize = ADC_CHANNEL_NUM; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_Init(DMA1_Channel1, &DMA_InitStructure);}static void adc_init(){ ADC_InitTypeDef ADC_InitStructure; 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 = ADC_CHANNEL_NUM; ADC_Init(ADC_CHANNEL, &ADC_InitStructure); ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC_CHANNEL, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5); ADC_DMACmd(ADC_CHANNEL, ENABLE); ADC_Cmd(ADC_CHANNEL, ENABLE); ADC_ResetCalibration(ADC_CHANNEL); while(ADC_GetResetCalibrationStatus(ADC_CHANNEL)); ADC_StartCalibration(ADC_CHANNEL); while(ADC_GetCalibrationStatus(ADC_CHANNEL));}static void adc_start(void){ ADC_SoftwareStartConvCmd(ADC_CHANNEL, ENABLE); // start convert DMA_Cmd(DMA1_Channel1, ENABLE);}void ADCInit(void){ adc_gpio_init(); adc_dma_init(); adc_init(); adc_start();}uint16_t ADCGetData(uint8_t channel){ uint16_t ret = 0; switch(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; case ADC_Channel_3: ret = ad_value[3]; break; case ADC_Channel_4: ret = ad_value[4]; break; } return ret;}uint16_t ADCGetAverage(uint8_t channel, uint8_t times){ uint16_t value; int i; for(i = 0; i < times; ++i) { value += ADCGetData(channel); } return (value / times);}#ifndef CONFIG_ADCvoid adc_test(void){ uint16_t buffer[ADC_CHANNEL_NUM]; float temp[ADC_CHANNEL_NUM]; buffer[0] = ADCGetData(ADC_Channel_0); temp[0] = (float)buffer[0] * 3.3 / 4096; printf("temp[0]: %f\r\n", temp[0]); buffer[1] = ADCGetData(ADC_Channel_1); temp[1] = (float)buffer[1] * 3.3 / 4096; printf("temp[1]: %f\r\n", temp[1]); buffer[2] = ADCGetData(ADC_Channel_2); temp[2] = (float)buffer[2] * 3.3 / 4096; printf("temp[2]: %f\r\n", temp[2]); buffer[3] = ADCGetData(ADC_Channel_1); temp[3] = (float)buffer[3] * 3.3 / 4096; printf("temp[1]: %f\r\n", temp[3]); buffer[4] = ADCGetData(ADC_Channel_4); temp[4] = (float)buffer[4] * 3.3 / 4096; printf("temp[2]: %f\r\n", temp[4]);}#endif
0 0
- STM32 —— 多路ADC采集
- STM32 —— 多路ADC采集
- R9 STM32之ADC—电压采集
- STM32——ADC
- STM32——ADC
- STM32——ADC
- 第30章 ADC—电压采集—零死角玩转STM32-F429系列
- STM32 ADC—DMA传输
- stm32 多通道ADC+DMA采集
- STM32 DMA 多通道 ADC 采集
- stm32cubemx 多路adc采集
- stm32 多路ADC
- STM32的ADC多通道采集的实现
- STM32 ADC中断后,AD继续在采集
- STM32:ADC采集数据实例(采用DMA模式)
- STM32 ADC 多通道16路电压采集
- STM32采集多路ADC到DMA的方法
- UglyMonste_Flying 丑八怪四轴——ADC电池电压采集
- HDU3397区间合并 延迟标记
- 栈的基本操作
- 关于IP遇到的坑
- ML2 配置 OVS VxLAN
- python学习语法
- STM32 —— 多路ADC采集
- Mysql 创建定时任务
- 写操作系统只能用C语言和汇编语言吗
- Linux 下编译运行C程序
- Mybatis 中 Cannot find class: BaseResultMap问题所在
- 创建 vxlan 并部署 instance
- C++ 宽字符和短字符转换
- AJAX的点个人总结
- vb.net 教程 2-12 程序的调试