STM32 ADC初始化与功能详解:设置与通道配置

需积分: 0 1 下载量 136 浏览量 更新于2024-08-16 收藏 1.22MB PPT 举报
本资源是一份关于STM32 AD转换器的详细教程,名为"函数ADC_Init-STM32 AD课件",主要针对STM32系列微控制器中的ADC(Analog-to-Digital Converter)进行讲解。ADC_Init函数的作用是根据用户提供的ADC_InitStruct参数,初始化特定的ADCx外设寄存器,以配置ADC的工作状态。STM32F103芯片内置两个12位逐次逼近型ADC模块(ADC1和ADC2),支持高精度模拟信号到数字信号的转换,其最高输入时钟限制为14MHz,可通过PCLK2分频获得。 ADC硬件结构包括18个输入通道,能够测量16个外部信号源和2个内部信号源,通道配置灵活,支持单次、连续、扫描或间断模式。转换结果可存储在16位数据寄存器中,且具备左对齐或右对齐的存储选项。举例来说,ADC1的输入通道可能连接到PA0至PA7等引脚。 主要特性包括: 1. 12位分辨率,确保转换精度。 2. 产生中断功能,如转换结束、注入转换结束和模拟看门狗事件。 3. 支持多种工作模式,如单次转换、连续转换、自动扫描模式以及间断模式。 4. 自动校准功能,确保数据准确性。 5. 数据一致性处理,如带内嵌数据对齐。 6. 可编程的采样间隔。 7. 支持外部触发转换。 8. 对于STM32F103xx增强型产品,转换时间在不同时钟速率下有所不同,例如56MHz时钟下约需1us,72MHz时钟下约需1.17us。 9. ADC工作电压范围宽,从2.4V到3.6V,输入信号范围限定在VREF-至VREF+之间。 10. 在规则通道转换期间,支持DMA请求,提高数据传输效率。 工作模式部分详细介绍了通道选择机制,使得用户可以根据需求灵活配置ADC的工作状态。这部分内容对于理解和应用ADC模块在实际项目中的操作至关重要,能够帮助开发者充分利用STM32的AD转换功能,实现精确的数据采集。

#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 上传