STM32 ADC转换器详解:通道选择与工作模式

需积分: 0 1 下载量 184 浏览量 更新于2024-08-16 收藏 1.22MB PPT 举报
"STM32 ADC Channel值用于选择不同的模拟输入通道,如ADC_Channel_0对应通道0,ADC_Channel_1对应通道1,ADC_Channel_17对应通道17。STM32的ADC模块具有丰富的功能和多种工作模式。" STM32的模拟数字转换器(ADC)是其微控制器中一个重要的组成部分,用于将模拟信号转化为数字信号。在STM32F103系列芯片中,有两个12位的ADC单元,即ADC1和ADC2,它们都是逐次逼近型转换器。这些ADC的设计允许输入时钟频率最高不超过14MHz,并由PCLK2时钟分频产生。 STM32的ADC提供多达18个输入通道,能够测量16个外部信号源和2个内部信号源。每个通道都可以按照单次、连续、扫描或间断模式执行转换。转换结果以16位数据的形式存储,可以左对齐或右对齐。例如,通道ADC123_IN0与PA0引脚相连,以此类推,覆盖了PA、PB和PC的部分引脚,以及在某些型号中,PF引脚上的部分通道。 ADC的主要特性包括12位的分辨率,转换结束时可产生中断,支持单次和连续转换模式,自动扫描多个通道,内置自校准功能,数据对齐选项,以及采样间隔的单独编程。此外,规则转换和注入转换都可以通过外部触发,还有间断模式和双重模式(在具有多个ADC的设备中)。转换时间取决于系统时钟速度,而ADC的工作电压范围为2.4V到3.6V,输入电压需在VREF-和VREF+之间。 在工作模式方面,用户可以选择不同的通道进行转换,可以设置单次转换,其中一次转换后停止;连续转换模式则会持续不断地进行ADC转换;扫描模式允许连续转换多个通道;间断模式在需要时启动和停止转换。此外,ADC还支持DMA(直接内存访问)请求,特别是在进行规则通道转换时,可以提高数据处理效率。 在实际应用中,根据项目需求,开发者需要配置相应的ADC寄存器来设定工作模式、通道选择、采样时间、触发源等参数。STM32提供了库函数支持,简化了ADC的操作,例如初始化ADC、配置通道、启动转换和读取转换结果等。通过理解ADC的工作原理和使用方法,开发者可以有效地利用STM32的ADC功能进行各种模拟信号的数字化处理。

#include "bflb_adc.h" #include "bflb_mtimer.h" #include "board.h" struct bflb_device_s adc; #define TEST_ADC_CHANNELS 2 #define TEST_COUNT 10 struct bflb_adc_channel_s chan[] = { { .pos_chan = ADC_CHANNEL_2, .neg_chan = ADC_CHANNEL_GND }, { .pos_chan = ADC_CHANNEL_GND, .neg_chan = ADC_CHANNEL_3 }, }; int main(void) { board_init(); board_adc_gpio_init(); adc = bflb_device_get_by_name("adc"); / adc clock = XCLK / 2 / 32 */ struct bflb_adc_config_s cfg; cfg.clk_div = ADC_CLK_DIV_32; cfg.scan_conv_mode = true; cfg.continuous_conv_mode = false; cfg.differential_mode = true; cfg.resolution = ADC_RESOLUTION_16B; cfg.vref = ADC_VREF_3P2V; bflb_adc_init(adc, &cfg); bflb_adc_channel_config(adc, chan, TEST_ADC_CHANNELS); for (uint32_t i = 0; i < TEST_COUNT; i++) { bflb_adc_start_conversion(adc); while (bflb_adc_get_count(adc) < TEST_ADC_CHANNELS) { bflb_mtimer_delay_ms(1); } for (size_t j = 0; j < TEST_ADC_CHANNELS; j++) { struct bflb_adc_result_s result; uint32_t raw_data = bflb_adc_read_raw(adc); printf("raw data:%08x\r\n", raw_data); bflb_adc_parse_result(adc, &raw_data, &result, 1); printf("pos chan %d,neg chan %d,%d mv \r\n", result.pos_chan, result.neg_chan, result.millivolt); } bflb_adc_stop_conversion(adc); bflb_mtimer_delay_ms(100); } while (1) { } }根据以上代码对bl618程序的编写对以下stm32中代码#include "stm32f10x.h" #include "delay.h" #include "FSR.h" #include "usart.h" #include "adc.h" #define PRESS_MIN 20 #define PRESS_MAX 6000 #define VOLTAGE_MIN 150 #define VOLTAGE_MAX 3300 u8 state = 0; u16 val = 0; u16 value_AD = 0; long PRESS_AO = 0; int VOLTAGE_AO = 0; long map(long x, long in_min, long in_max, long out_min, long out_max); int main(void) { delay_init(); NVIC_Configuration(); uart_init(9600); Adc_Init(); delay_ms(1000); printf("Test start\r\n"); while(1) { value_AD = Get_Adc_Average(1,10); VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300); if(VOLTAGE_AO < VOLTAGE_MIN) { PRESS_AO = 0; } else if(VOLTAGE_AO > VOLTAGE_MAX) { PRESS_AO = PRESS_MAX; } else { PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX); } printf("ADÖµ = %d,µçѹ = %d mv,ѹÁ¦ = %ld g\r\n",value_AD,VOLTAGE_AO,PRESS_AO); delay_ms(500); } } long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }移植到bl618进行改写

2023-05-12 上传