目录
一、介绍
太阳能光伏板是一种利用太阳光直接发电的光电半导体薄片。光-电直接转换方式是利用光电效应,将太阳辐射能直接转换成电能,光-电转换的基本装置就是太阳能电池。太阳能电池是一种由于光生伏特效应而将太阳光能直接转化为电能的器件。当许多个电池串联或并联起来就可以成为有比较大的输出功率的太阳能电池方阵了。

以下是光伏板传感器的参数:
|------|-------------|
| 尺寸 | 60*60mm |
| 额定电压 | 3V |
| 额定电流 | 150mA |
| 功率 | 0.45W |
| 厚度 | 2.5mm±0.3mm |
| 重量 | 10g |
(资料分享见文末)
二、传感器原理
1.尺寸图

2.引脚描述
|------|-----|
| 引脚名称 | 描述 |
| + | VCC |
| - | GND |
三、程序设计
1.使用STM32F103C8T6读取电压传感器采集的数据
2.将读取得到的光伏板电压显示在OLED上显示
|----------|-----|
| S | PA0 |
| OLED_SCL | PB6 |
| OLED_SDA | PB7 |
| 串口 | 串口1 |
main.c文件
cpp
#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文件
cpp
#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文件
cpp
#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
四、实验效果
