STM32电压传感器

📅 发布时间:2026/7/9 0:05:39 👁️ 浏览次数:
STM32电压传感器
目录一、介绍二、传感器原理1.实物图2.引脚描述三、程序设计main.c文件voltag.c.文件voltag.h文件四、实验效果五、资料获取项目分享一、介绍此模块基于电阻分压原理所设计能使端子接口输入的电压缩小5倍模拟输出电压最大为5V那么电压检测模块的输入电压则不能大于5V*525V(如果用到3.3V系统输入电压不能大于3.3V*516.5V)。以下是电压传感器的参数工作DC3.3/5V电压输入范围DC 0~25V电压模拟分辨率0.0061V尺寸28×14mm哔哩哔哩视频链接https://www.bilibili.com/video/BV1LdPszdE6h/?spm_id_from333.1387.homepage.video_card.clickvd_source199aed5297a00e80e1faf7e270afe8d7资料分享见文末二、传感器原理1.实物图2.引脚描述引脚名称描述VCC供给电压DCGND地线S模拟电压输出信号三、程序设计1.使用STM32F103C8T6读取土壤湿度传感器采集的数据通过串口发送至电脑2.将读取得到的数据同时在OLED上显示土壤湿度AOPA0OLED_SCLPB11OLED_SDAPB10串口串口1main.c文件#include stm32f10x.h #include delay.h #include oled.h #include voltage.h /*****************辰哥单片机设计****************** STM32 * 文件 : 电压传感器实验 * 版本 : V1.0 * 日期 : 2026.3.4 * MCU : STM32F103C8T6 * 接口 : 见代码 * IP账号 : 辰哥单片机设计同BILIBILI|抖音|快手|小红书|CSDN|公众号|视频号等 * 作者 : 辰哥 * 工作室 : 异方辰电子工作室 * 官方网站 : www.yfcdz.cn **********************BEGIN***********************/ // 将浮点数拆分为整数和小数保留 2 位小数 static void Float2IntDec(float value, uint32_t *intp, uint32_t *decp) { uint32_t temp (uint32_t)(value * 100.0f 0.5f);// 放大 100 倍并四舍五入 *intp temp / 100;// 整数部分 *decp temp % 100;// 小数部分2 位 } int main(void) { SystemInit(); delay_init(72); OLED_Init(); Voltage_Init(); // 初始化 PA0 ADC uint32_t int_part, dec_part; while (1) { float volt ADC_GetVoltage(); // 获取电压 Float2IntDec(volt, int_part, dec_part); // 拆分为整数/小数 // OLED 显示 OLED_ShowChinese(0, 0, 0, 16, 1); // 电 OLED_ShowChinese(16, 0, 1, 16, 1); // 压 OLED_ShowChar(32, 0, :, 16, 1); OLED_ShowNum(40, 16, int_part, 2, 16, 1); OLED_ShowChar(56, 16, ., 16, 1); OLED_ShowNum(64, 16, dec_part, 2, 16, 1); OLED_ShowChar(88, 16, V, 16, 1); OLED_Refresh(); delay_ms(500); } }voltag.c文件#include voltage.h #include delay.h /*****************辰哥单片机设计****************** STM32 * 文件 : 电压传感器实验 * 版本 : V1.0 * 日期 : 2026.3.4 * MCU : STM32F103C8T6 * 接口 : 见代码 * IP账号 : 辰哥单片机设计同BILIBILI|抖音|快手|小红书|CSDN|公众号|视频号等 * 作者 : 辰哥 * 工作室 : 异方辰电子工作室 * 官方网站 : www.yfcdz.cn **********************BEGIN***********************/ // 初始化 ADC配置指定引脚为模拟输入 void Voltage_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; ADC_InitTypeDef ADC_InitStruct; // 1. 使能 GPIO 和 ADC 时钟 RCC_APB2PeriphClockCmd(ADC_GPIO_CLK | ADC_CLK, ENABLE); // 2. ADC 时钟分频72MHz / 6 12MHz RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 3. 配置 GPIO 为模拟输入 GPIO_InitStruct.GPIO_Pin ADC_GPIO_PIN; GPIO_InitStruct.GPIO_Mode GPIO_Mode_AIN; GPIO_Init(ADC_GPIO_PORT, GPIO_InitStruct); // 4. ADC 基本配置 ADC_InitStruct.ADC_Mode ADC_Mode_Independent; // 独立模式 ADC_InitStruct.ADC_DataAlign ADC_DataAlign_Right; // 右对齐 ADC_InitStruct.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; // 软件触发 ADC_InitStruct.ADC_ContinuousConvMode DISABLE; // 单次转换 ADC_InitStruct.ADC_ScanConvMode DISABLE; // 非扫描 ADC_InitStruct.ADC_NbrOfChannel 1; // 通道数 ADC_Init(ADCx, ADC_InitStruct); // 5. 使能 ADC 并校准 ADC_Cmd(ADCx, ENABLE); ADC_ResetCalibration(ADCx); while (ADC_GetResetCalibrationStatus(ADCx)); // 等待复位校准完 ADC_StartCalibration(ADCx); while (ADC_GetCalibrationStatus(ADCx)); // 等待校准完成 } // 读取指定引脚电压8 次平均返回电压值 float ADC_GetVoltage(void) { uint16_t sum 0; uint8_t i; // 配置 ADC 通道和采样时间 ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1, ADC_SampleTime_239Cycles5); for (i 0; i 8; i) // 8 次采样平均 { ADC_SoftwareStartConvCmd(ADCx, ENABLE); // 启动转换 while (!ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC)); // 等待转换完成 sum ADC_GetConversionValue(ADCx); // 累加 ADC 原始值 delay_us(10); // 微小间隔确保 ADC 稳定 } float adc_average sum / 8.0f; //计算平均原始值 float voltage (adc_average * VREF) / ADC_RESOLUTION; // 平均值 × 参考电压 / 分辨率 voltage * VOLT_DIV_RATIO; // 还原真实电压考虑分压 return voltage; }voltag.h文件#ifndef __VOLTAGE_H #define __VOLTAGE_H #include stm32f10x.h /*****************辰哥单片机设计****************** STM32 * 文件 : 电压传感器实验 * 版本 : V1.0 * 日期 : 2026.3.4 * MCU : STM32F103C8T6 * 接口 : 见代码 * IP账号 : 辰哥单片机设计同BILIBILI|抖音|快手|小红书|CSDN|公众号|视频号等 * 作者 : 辰哥 * 工作室 : 异方辰电子工作室 * 官方网站 : www.yfcdz.cn **********************BEGIN***********************/ // 选择 ADC 编号 #define ADCx ADC1 #define ADC_CLK RCC_APB2Periph_ADC1 // 选择 GPIO 端口和引脚 #define ADC_GPIO_PORT GPIOA #define ADC_GPIO_PIN GPIO_Pin_0 #define ADC_GPIO_CLK RCC_APB2Periph_GPIOA // 对应的 ADC 通道 #define ADC_CHANNEL ADC_Channel_0 // 电压计算参数 #define VREF 3.3f // 参考电压 #define ADC_RESOLUTION 4095 // 12 位 ADC 分辨率 #define VOLT_DIV_RATIO 5.0f // 分压比 // void Voltage_Init(void); // 初始化 ADC float ADC_GetVoltage(void); // 获取 PA0 引脚电压V #endif四、实验效果五、资料获取项目分享