STM32太阳能光伏板

目录

一、介绍

二、传感器原理

1.尺寸图

2.引脚描述

三、程序设计

main.c文件

voltag.c文件

voltag.h文件

四、实验效果

五、资料获取

项目分享


一、介绍

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

以下是光伏板传感器的参数:

|------|-------------|
| 尺寸 | 60*60mm |
| 额定电压 | 3V |
| 额定电流 | 150mA |
| 功率 | 0.45W |
| 厚度 | 2.5mm±0.3mm |
| 重量 | 10g |

哔哩哔哩视频链接: https://www.bilibili.com/video/BV1aYPQz4EtY/?spm_id_from=333.1387.homepage.video_card.click&vd_source=199aed5297a00e80e1faf7e270afe8d7

(资料分享见文末)

二、传感器原理

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

四、实验效果

五、资料获取

项目分享

相关推荐
mftang2 小时前
MCU上应用的主流NVM技术: 嵌入式相变存储器(PCM) 和嵌入式磁阻随机存取存储器(MRAM)
单片机·嵌入式硬件·pcm
炸膛坦客2 小时前
Cortex-M3-STM32F1 开发:(五十四)CAN(车企会用),难但很重要
stm32·单片机·嵌入式硬件
willhuo2 小时前
RS485回响程序设计方案
单片机·lua
项目題供诗2 小时前
51单片机入门-LED点阵屏(九)
单片机·嵌入式硬件·51单片机
恶魔泡泡糖2 小时前
51单片机ADC模数转换
单片机·嵌入式硬件·51单片机
项目題供诗2 小时前
51单片机入门-DS1302时钟(十)
单片机·嵌入式硬件·51单片机
恶魔泡泡糖2 小时前
51单片机DAC数模转换
单片机·嵌入式硬件·51单片机
单片机设计星球2 小时前
51单片机的【智能台灯】仿真设计
单片机·嵌入式硬件·51单片机
智者知已应修善业2 小时前
【51单片机8位密码锁】2023-2-22
c语言·经验分享·笔记·单片机·嵌入式硬件·算法·51单片机