资讯动态

STM32太阳能追光系统实战:光敏传感器闭环控制与PWM舵机驱动

发布时间:2026/10/16 4:14:57 来源:尧图企业网站定制
简介基于STM32单片机的太阳能电池板追日光跟踪系统设计资料面向嵌入式开发学习者、电子竞赛队伍与新能源应用工程师解决太阳能板实时追踪阳光、提升发电效率的工程问题。压缩包共365个文件、约84.26MB主要包含68个h与66个c格式的完整源码、36个o目标文件、原理图与PCB设计文件、11个doc及6个pdf技术文档、5个mp4演示视频和33张实物图片从程序编写、硬件搭建到联调演示均有覆盖。已有6060人学习下载。资料以Keil工程为主线ADC光线采集、PWM步进电机控制、光敏传感器数据处理等代码模块便于直接移植文档中还介绍了日晷算法、季节倾角自适应策略以及防风稳定性与电源管理设计适合用于毕业设计、竞赛制作或产品原型开发是一份能帮助理解STM32嵌入式系统完整开发流程的实用资源。1. 项目定位把固定光伏板升级成会“追太阳”的 STM32 控制系统拆过不少光伏相关的项目固定安装的太阳能板最大的痛点就是太阳位置一直在变而板子的倾角不变午前午后发电量直线下滑。实测数据里固定式光伏板在早上和傍晚的有效发电时长损失超过三成。这个项目的思路很直接——用四路光敏传感器感知太阳方位交给 STM32 去判断“光从哪边来”再通过 PWM 驱动舵机转动太阳能板让板子始终正对光源。整体不依赖 GPS 或天文算法纯靠光感闭环控制硬件成本压得很低核心板加传感器加舵机几十块钱就能搭起来。适合正在做课设、想给自家小光伏系统加自动跟踪功能或者对 STM32 的 ADC 采集与 PWM 电机控制还停留在点灯阶段的开发者。全文基于 HAL 库工程展开从电路原理到核心追光算法再到避坑经验一次讲透。2. 硬件架构拆解光感阵列、舵机驱动与供电拓扑2.1 系统框图与物料清单整套系统的信号链路是四个光敏电阻分别布置在太阳能板的上下左右四个边缘通过分压电路把光照强度转换为电压信号STM32 的 ADC 采集这四路电压后做差值比较得到“光源相对板面偏转的方向”随后控制器调整 PWM 占空比舵机带动板面转动直到四路光强差值落入允许误差范围。这是一个典型的闭环负反馈控制系统没有额外的位置反馈传感器位置信息完全来自光感数据。以下是我按该项目思路整理的一份最小可用物料清单主控选了最常见的 STM32F103C8T6 核心板传感器和舵机都是通用件物料型号/规格数量用途主控STM32F103C8T6 核心板1ADC 采集与 PWM 输出光敏电阻GL55284检测上下左右光照强度分压电阻10kΩ 直插电阻4与光敏电阻组成分压采样电路舵机SG909g1单轴水平追光单轴方案用 1 个即可舵机电源5V / 1A 以上独立供电1舵机启动瞬间电流可达数百毫安太阳能板6V / 5W 多晶硅板1被控对象充电模块TP40561太阳能板给锂电池充电锂电池18650 两节串联7.4V2储能与系统供电降压模块LM2596 或 MP15841给主控和舵机提供 5V / 3.3V这里要注意一个工程细节舵机的平均电流虽然只有 100mA 左右但堵转或启动时瞬态电流可能冲到 500mA 甚至更高。如果舵机和 STM32 共用同一个 3.3V LDO 输出电压会被瞬间拉低直接导致单片机复位。所以供电设计上我强烈建议舵机单独用 5V 电源主控系统与舵机只共地不共电。2.2 光敏采集电路分压网络与 ADC 通道映射光敏电阻采集电路非常经典。每个光敏电阻与一个固定电阻串联串联点接到 STM32 的 ADC 引脚。计算公式是Vout VCC * R_fixed / (R_light R_fixed)。光照越强光敏电阻阻值越小Vout 越高相反光照越弱Vout 越低。选 10kΩ 的固定电阻比较适中既能覆盖从暗处到强光下的电压变化范围又不会让暗光下输出直接贴地。以四路光感为例我把它们接到 ADC1 的四个通道上。在 STM32F103C8T6 上ADC1 的通道分布在 PA0 到 PA7选 PA0、PA1、PA2、PA3 对应 IN0 到 IN3分别代表左、右、上、下四个方向。接线时还要注意光敏电阻到单片机引脚的连线尽量短如果环境有电机等电磁干扰源建议在 ADC 引脚与 GND 之间并一个 0.1uF 的陶瓷电容给高频噪声一条泄放回路。2.3 舵机与驱动方式PWM 频率与脉宽映射SG90 舵机是一个典型的 50Hz PWM 控制器件要求周期为 20ms脉宽 0.5ms 到 2.5ms 对应 0° 到 180°。控制器通过改变高电平持续时间来设置舵机输出轴的位置。要注意的是舵机内部有一个小电位器做位置反馈它不是在持续高速旋转而是“转到目标角度然后保持”所以追光系统里舵机每次只需要转动一个小角度不需要连续旋转电机。用 STM32 实现 PWM 输出很简单选择任意一个通用定时器比如 TIM2把通道 1 配置为 PWM 模式预分频器和自动重装值配合把 PWM 频率设为 50Hz。假设定时器时钟为 72MHz经过 71 分频后得到 1MHz 计数频率再设置自动重装值为 19999这样计数周期就是 20ms正好对应 50Hz。此时一个计数单位代表 0.001ms脉宽 1.5ms 对应的比较值为 1500。2.4 太阳能板与充电回路的接入设计太阳能板的输出并不是一个稳定的直流源它随光照强度变化很大。光照弱时输出电压可能只有 3V 多强光下空载电压能到 7V 以上。直接拿它给锂电池充电需要经过 TP4056 这类线性充电管理芯片它内部有恒流恒压逻辑会把太阳能板的输出适配到锂电池充电曲线。电池再经过降压模块给主控和舵机供电整个系统才能稳定运行。如果不想用锂电池也可以直接用 USB 5V 供电给主控和舵机太阳能板输出端只接一个电阻分压到 ADC 做“电池电压监测”这是把追光系统和充电系统独立开来做的简化版本。但实际项目中我更推荐加充电管理因为太阳能追光本身就是为了多发电发的电无处存就等于白做。调试时先用 USB 供电跑通追光逻辑再把光伏充电回路接进来这是最稳妥的顺序。3. 核心代码解析从 ADC 多通道采集到滞回追光算法3.1 工程初始化与引脚复用配置在 HAL 库工程里ADC 和 PWM 的初始化分为两部分CubeMX 图形化配置和初始化函数调用。ADC1 配置为扫描模式、连续转换通道数量设为 4采样时间拉长一些TIM2 的 Channel1 配置为 PWM 模式预分频值 PSC71自动重装值 ARR19999。下面是关键的初始化片段。void MX_ADC1_Init(void) { hadc1.Instance ADC1; hadc1.Init.ScanConvMode ENABLE; // 扫描模式连续采集多个通道 hadc1.Init.ContinuousConvMode ENABLE; // 连续转换DMA 持续搬运 hadc1.Init.DiscontinuousConvMode DISABLE; hadc1.Init.ExternalTrigConv ADC_SOFTWARE_START; hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion 4; // 一共 4 个通道 HAL_ADC_Init(hadc1); sConfig.Channel ADC_CHANNEL_0; // PA0 - 左 sConfig.Rank 1; sConfig.SamplingTime ADC_SAMPLETIME_239CYCLES_5; HAL_ADC_ConfigChannel(hadc1, sConfig); // 其余三个通道的配置结构完全一样分别设为 CHANNEL_1 / CHANNEL_2 / CHANNEL_3 // Rank 依次为 2 / 3 / 4。 }ScanConvMode 打开后才能在一次 ADC 转换序列中按 Rank 顺序扫描多个通道ContinuousConvMode 让转换结束后立即开始下一轮这样配合 DMA 可以做到数据自动持续刷新。采样时间选了 239.5 周期属于比较保守的值适合光敏电阻这种输出阻抗偏高的信号源如果采样时间太短ADC 内部采样电容可能充不满读数会偏低并且抖动。PWM 部分的初始化只需要把定时器设置成 PWM 模式后面在控制逻辑里直接修改比较寄存器就可以了。void MX_TIM2_Init(void) { htim2.Instance TIM2; htim2.Init.Prescaler 71; // 72MHz / 72 1MHz htim2.Init.Period 19999; // 1MHz / 20000 50Hz htim2.Init.CounterMode TIM_COUNTERMODE_UP; HAL_TIM_Init(htim2); sConfig.OCMode TIM_OCMODE_PWM1; sConfig.Pulse 1500; // 初始 1.5ms 脉宽舵机 90° sConfig.OCPolarity TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(htim2, sConfig, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1); }PWM 周期 20ms 是 SG90 舵机的工作基准。如果 ARR 设成 1999 而不是 19999周期就会变成 2ms对应 500Hz这超出了普通模拟舵机的响应范围舵机会啸叫发烫甚至直接烧毁这是新手最容易犯的错。3.2 四路光强采集DMA 搬运与滑动滤波ADC 转换结果由 DMA 自动搬运到内存数组里主循环只需要读数组不需要阻塞等待转换完成。这个异步读取方式能保证追光算法数据总是最新的而不会因为某次转换慢导致控制周期抖动。#define SENSOR_NUM 4 #define FILTER_SIZE 8 uint32_t adc_raw[SENSOR_NUM]; uint16_t filter_buf[SENSOR_NUM][FILTER_SIZE]; uint8_t filter_index 0; void ADC_DMA_Start(void) { HAL_ADC_Start_DMA(hadc1, (uint32_t *)adc_raw, SENSOR_NUM); } void Update_Sensor_Filter(void) { uint8_t i; filter_index (filter_index 1) % FILTER_SIZE; for (i 0; i SENSOR_NUM; i) { filter_buf[i][filter_index] adc_raw[i] 0x0FFF; // 低 12 位有效 } } uint16_t Get_Average_Value(uint8_t ch) { uint32_t sum 0; uint8_t i; for (i 0; i FILTER_SIZE; i) { sum filter_buf[ch][i]; } return (uint16_t)(sum / FILTER_SIZE); }滑动滤波的核心价值是抑制光敏电阻的随机噪声。在实际环境里光源经过云层遮挡或树叶缝隙时瞬时读数波动可能达到 40 到 60 个 ADC 码值如果直接拿瞬时值做比较系统会被误触发得来回抖动。取 8 次平均值后高频噪声被压制到 5 个码值以内控制稳定性好很多。3.3 追光核心算法差值判断与滞回比较规则追光的本质是比较上下左右四个方向的光强大小然后决定舵机朝哪个方向转。这里最忌讳的是“只要有差异就立刻转”因为光敏电阻本身存在个体差异、安装角度差异四路在正对光源时读数也不可能完全相等。如果阈值设成 0系统会永远在微调中转个不停。我的做法是把运动决策拆成两个维度水平方向和垂直方向。每个维度先算出差值再和滞回阈值比较。滞回的意思是动作触发阈值和停止阈值不同一旦进入转动状态必须等差值回落到更小的数值才停止避免在临界点附近反复开关。#define HYST_ON 30 // 触发转动的差值阈值 #define HYST_OFF 10 // 停止转动的差值阈值 #define GAIN_K 2 // 角度修正系数 int16_t left_val Get_Average_Value(0); int16_t right_val Get_Average_Value(1); int16_t top_val Get_Average_Value(2); int16_t bottom_val Get_Average_Value(3); int16_t diff_h left_val - right_val; // 水平差值正数表示光源偏左 int16_t diff_v top_val - bottom_val; // 垂直差值正数表示光源偏上 if (diff_h HYST_ON) { servo_angle - GAIN_K; // 向左转减小角度 } else if (diff_h -HYST_ON) { servo_angle GAIN_K; // 向右转增大角度 } if (diff_v HYST_ON) { angle_v GAIN_K; // 向上抬 } else if (diff_v -HYST_ON) { angle_v - GAIN_K; // 向下低 }GAIN_K 不是固定不变的常量它与控制周期和舵机响应速度强相关。比如控制周期是 20ms舵机每 20ms 转 2°从明显偏差到对准需要十几步整个过程平滑不突兀。如果 GAIN_K 调大到 10舵机会快速摆动但由于机械惯性容易冲过目标角度形成振荡。常见做法是先设 1 到 2实测响应太慢再加。3.4 舵机角度到 PWM 脉宽的映射舵机角度范围并不需要做成完整的 0° 到 180°实际项目中一般限制在 0° 到 180° 之间甚至收窄到 10° 到 170°防止机械结构撞到限位。角度到比较值的换算公式为Compare 500 angle * 2000 / 180。因为 0° 对应 0.5ms 即 500 个计数单位180° 对应 2.5ms 即 2500 个计数单位脉冲宽度随角度线性增长。#define SERVO_MIN 10 #define SERVO_MAX 170 void Set_Servo_Angle(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t angle) { uint32_t compare; if (angle SERVO_MIN) angle SERVO_MIN; if (angle SERVO_MAX) angle SERVO_MAX; compare 500 (angle * 2000) / 180; __HAL_TIM_SET_COMPARE(htim, channel, compare); }注意实际舵机在 0° 和 180° 两端往往会出现嘶嘶声因为内部电位器已经接近物理极限。把角度限制在 10° 到 170° 是工程上很常见的做法宁可损失一点点行程也不让舵机长时间堵转发热。极限位置堵转是舵机烧毁的第一大原因。3.5 主循环的调度节奏采样、决策、执行分离主循环采用了一个很朴素的时间片调度方式不上 RTOS因为系统单任务就足够。每一轮循环依次执行三个动作更新滤波缓存、计算差值并调整目标角度、把角度写到 PWM 比较寄存器。整个过程没有任何阻塞等待即使某次 ADC 数据未刷新也能用旧数据继续决策系统天然具备容错能力。while (1) { Update_Sensor_Filter(); LightTracking_Update(); // 内部完成差值比较和角度调整 Set_Servo_Angle(htim2, TIM_CHANNEL_1, servo_angle_h); Set_Servo_Angle(htim3, TIM_CHANNEL_1, servo_angle_v); HAL_Delay(20); // 控制周期 20ms }HAL_Delay(20) 是控制节奏的关键。舵机的响应周期就是 20ms控制频率高于舵机响应速度没有意义反而会让调整累积过快。整套系统的“感知 - 决策 - 执行”周期就是 20ms大约 1 秒完成 50 次微调从大幅偏差到对准在户外实测一般需要 2 到 4 秒。这个响应速度对于太阳能追光场景完全够用因为太阳角速度非常缓慢每分钟的变化不超过 0.25°。4. 搭建与运行从 CubeMX 配置到板级调试全流程4.1 用 CubeMX 生成最小工程打开 STM32CubeMX新建基于 STM32F103C8T6 的工程。在上方芯片选择器的搜索框里输入芯片型号双击选中。首先是系统时钟配置在 RCC 选项卡中把 HSE 设置为 Crystal/Ceramic Resonator然后进入 Clock Configuration 页面把 PLL Source 选为 HSE输入 8MHz 外部晶振倍频到 72MHz。注意如果核心板上焊的是 8MHz 晶振这里直接设 72MHz 即可如果是 25MHz 晶振需要按实际值分频。接下来配置引脚功能。左侧 Pinout 视图中把 PA0、PA1、PA2、PA3 设置为 ADC1_IN0 到 ADC1_IN3把 PA6 设置为 TIM3_CH1或者 PA0 复用为 TIM2_CH1看具体分配再打开 USART1 用于串口打印。GPIO 速度全部保持低速即可因为这些信号都不是高频信号。在 ADC 的参数设置里勾选 Scan Conversion Mode 和 Continuous Conversion ModeNumber of Conversion 填 4。逐个配置每个 Channel 的 Rank 顺序和采样时间。定时器 TIM3 的参数里Pre-scaler 填 71Counter Period 填 19999Pulse 填 1500Mode 选 PWM Generation 1。生成代码时选择 Keil MDK-ARM 工具链并勾选 Generate peripheral initialization as a pair of .c/.h files这样每个外设都有独立的初始化和头文件后续查找逻辑更方便。4.2 编译条件与链接脚本里的常见问题用 Keil 打开生成的工程后直接把 main.c 里加上自己的逻辑就能编译。但有两个系统级配置需要检查。第一Target 选项卡里的 ARM Compiler 版本如果是 AC6代码里不能出现 ANSI C 的“//”注释以外的特殊字符HAL 库本身兼容 AC5 和 AC6不需要额外处理。第二C99 Mode 如果没打开某些循环内声明变量的写法会报错建议勾选。另一个容易翻车的地方是固件包版本。STM32CubeMX 里选择 F1 系列固件包时版本过低会导致 HAL 库函数名差异。较老的 1.6.0 版本里HAL_ADC_Init的形参类型是ADC_HandleTypeDef而新版本增加了ADC_InitTypeDef的配置域只要工程由 CubeMX 生成这些差异都被自动抹平了不要手动往工程里拷贝旧版本的库文件这是新手最容易遇到的编译错误来源。4.3 烧录与串口日志验证编译通过后连接 ST-Link 烧录器到 SWD 接口。ST-Link 接线只需要四根线SWDIO、SWCLK、GND、3.3V。在 Keil 的 Options for Target 里选择 ST-Link DebuggerSettings 界面把 Port 选为 SWMax Clock 设为 4MHz 以下可靠性更高。点击 Download 按钮烧录后程序会自动启动。第一个要验证的就是四路 ADC 数据。打开串口助手波特率设 115200在代码里用 printf 重定向把四路平均值和舵机当前角度打印出来。用手电筒从左边照射观察 left_val 是否明显升高照射右边观察 right_val 是否升高。如果左右两路数值变化不敏感先用万用表量一下光敏电阻分压点电压确认是接线问题还是 ADC 配置问题。这一步发现的硬件问题比后面追光调试验证时发现要容易排查得多。printf(L%4d R%4d T%4d B%4d Angle%3d\r\n, avg_left, avg_right, avg_top, avg_bottom, servo_angle_h);4.4 板上调试流程由慢到快的验证顺序刚上电时舵机能不能归中、能不能转动是最基础的一步。程序启动后先把角度设置为 90°观察舵机是否停在中间位置。随后用手缓慢遮挡左侧光敏电阻理论上舵机应该向右转去寻找光源松开遮挡舵机应该回到中间偏左的位置。这里的关键是验证方向和算法对应关系如果方向反了在算法里把加减号对调即可不需要改硬件接线。整个追光逻辑在室内用手电筒就可以完成大部分验证把手电筒固定在距系统 30cm 的位置从不同的角度照射系统观察舵机是否跟随手电筒的方位转动。室内验证的目的不是模拟太阳而是测试“光照变化到电机响应”的链路是否畅通。确认无误后再把系统搬到阳台或窗边让太阳能板对准天空观察一整天的日志数据看角度曲线是不是从东到西平滑移动。这里有一条血泪经验不要把舵机角度日志打印得太频繁一秒钟打 50 行串口缓冲区一会儿就塞满而且 printf 本身占用了大量 CPU 时间。调试期 500ms 打一行足够正式运行可以直接关掉串口打印。5. 实践避坑光感失灵、异常抖动与供电不稳的四类排查5.1 ADC 数值跳变严重四路波形像心电图一样乱跳现象串口打印出的 ADC 原始值在无光照变化时依然上下波动 30 到 100 个数追光系统因此频繁误判方向。原因最常见的是光敏电阻引脚没有滤波电容模拟电源引脚 VREF 与 VDDA 之间的去耦电容被省掉了或者是 ADC 采样时间设置过短。光敏电阻的输出阻抗本来就高引脚悬空或者走线过长时会像天线一样接收周围的干扰信号。解决先在每个 ADC 引脚对地并一个 0.1uF 陶瓷电容位置越靠近单片机引脚越好再用测试代码把采样时间调成 239.5 周期。如果数值还是跳检查核心板上的 VDDA 引脚是否接到了和 VDD 一样的 3.3V部分核心板默认断开 VDDA需要手工短接。这两步做完原始值波动一般能压到 5 个码值以内。5.2 舵机对着光源方向反复来回扫动始终稳定不下来现象追光系统在某个角度附近持续左右摆动频率甚至高达每秒十几次舵机发热严重。原因追光算法的触发阈值 HYST_ON 设置太小或者角度修正系数 GAIN_K 过大。光敏阵列的差值在触发阈值附近徘徊时系统像“拉锯战”一样来回运转。机械结构上的空闲行程也会放大这个问题——舵机转 2°太阳能板实际响应可能有滞后形成一个延迟振荡。解决先把 HYST_ON 从 20 上调到 50让触发不那么敏感再把 GAIN_K 从 5 下调到 2。如果还是抖在算法里加入一个“锁定窗口”机制当角度更新后400ms 内不再接受反向转动指令。这样给机械响应一个稳定时间抖动一般就能消除。5.3 阴天或室内弱光环境下系统直接“失能”现象遮住一半光线或者进入阴天环境后四路光敏电压都掉到很低的位置差值几乎为零追光系统停在一个角度不动了手动掰动太阳能板也不会自动复位。原因光敏电阻在弱光下阻值非常大四路分压点电压都几乎为 0差值与触发阈值相比微乎其微。此时不是追光逻辑出问题而是信号量程不够电路把有效信号给“压扁”了。解决在硬件上10kΩ 固定电阻换成 100kΩ 到 200kΩ让弱光下分压曲线更陡差值更明显在软件上增加一个“暗光休眠”状态当四路平均光强低于某个下限值比如 300时让舵机回到 90° 等待位而不是停在原地。这个休眠机制还有一个额外好处夜间系统不再消耗舵机电流降低整机待机功耗。5.4 舵机一转单片机就自动复位重启现象追光开始后舵机动作的一瞬间核心板 LED 闪烁程序重新开始执行。用万用表测量主控 3.3V 引脚电压能观察到瞬间跌落到 2.8V 以下。原因舵机是感性负载启动瞬间需要很大的电流如果主控和舵机共用同一个电源轨压降会被直接传导到单片机的复位引脚上。锂电池电压带载能力弱时尤其明显。解决这是供电拓扑问题不是软件问题。把舵机电源改成 5V 独立供电锂电池先接降压模块输出 5V再用一个 3.3V LDO 单独给主控供电。两个电源轨之间只共地。如果板子上空间充足还可以在舵机电源入口并联一个 470uF 电解电容吸收启动浪涌。改完后用示波器确认复位引脚电压纹波低于 100mV问题就不会再出现。6. 二次开发从单轴追光升级到双轴 MPPT 联动单轴方案升级到双轴追光硬件上只增加一个舵机和两组光敏传感器就可以实现。现有的算法本身已经分成水平和垂直两个维度代码里只需要把垂直舵机的 PWM 输出补上再把传感器布局按照“左上 / 右上 / 左下 / 右下”四象限重新布置就能实现两个维度独立的闭环控制。布局方式是在太阳能板四角各装一个光敏电阻水平差值取左侧两路之和减右侧两路之和垂直差值取上方两路之和减下方两路之和。这样求差值的抗干扰能力比单点对比更强局部阴影不会造成误判。双轴系统的代码组织建议按模块划分把传感器采集、决策算法和舵机执行拆成三个独立文件。后续无论是换算法还是换硬件都不需要动主循环逻辑。我一般会把决策算法设计成一个状态机分几个状态启动归中、快速扫描、精确跟踪、暗光休眠。快速扫描状态里舵机以较大步进转动找到光强最大方向后切入精确跟踪精确跟踪时步进缩小角度修正系数降低。状态机的核心是每个状态有确定的进入条件和退出条件日志里打一个状态码定位问题会比看四路裸数据快得多。另外一个提升比较大的改造方向是加入 MPPT 联动。追光是让板子正对太阳但光伏板在真实光照下最大功率点并不一定等于最大光照点因为温度、散射光分布也会影响输出功率。常见做法是在太阳能板输出端串联一个采样电阻通过 ADC 采集输出电压和电流算出当前输出功率然后让板子在最大光照角度附近做小幅度扫描找出功率最大的角度。这个“光感粗定位 MPPT 精定位”的组合方案在实际项目中能再提升百分之三到五的发电效率是光伏追光系统里比较深入的一个方向。验证二次开发成果时我习惯用两块同样的太阳能板做对比测试一块固定安装在 30° 倾角另一块安装追光系统两块板子接同样的电子负载在正午到午后这段时间记录各自的累计充电容量。理想情况下追光板的累计发电量应该高出一截。如果只是角度跟随正常但发电量没有明显提升就要检查充电模块的输入电压和电流是不是被压得很低这往往是过压保护在起作用而不是追光不成功。从那以后我每改一次传感器位置或者舵机安装角度都强制把 HYST_ON 和 GAIN_K 重新标定一遍。因为光感阵列的物理布局变了四周的遮光环境也变了旧的系数拿到新结构上大概率会抖动或者响应迟钝。这种“换硬件必查参数”的习惯帮我避免了很多次返工也希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑