专业版
#第十届立创电赛#手电控制核心板

创建时间:6天前

15 0

描述

<h1><strong>一、项目功能介绍</strong></h1> <h3>1、核心功能概述</h3> <p>可拓展小电包-手电模块-控制核心板 这是一个手电项目的核心板,实现了受按键控制的双路PWM输出,用以控制LED恒流模块,以及通过NTC实现的温度检测及与之对应的风扇PWM控制,为LED模块提供温度管理。 其余可能的应用:加热台、风扇控制等。</p> <h3>2、LED调光控制</h3> <ul> <li>双通道独立控制: <ul> <li>通道A/B独立控制,支持单通道或双通道同时操作</li> <li>三种工作模式:仅A通道、仅B通道、双通道同步</li> </ul></li> <li>丝滑调光功能: <ul> <li>短按:±10%占空比调节(20kHz PWM)</li> <li>长按:无极调光(每30ms ±1%)</li> </ul></li> <li>状态记忆功能: <ul> <li>自动保存各通道亮度设置</li> <li>模式切换时无缝恢复历史状态</li> </ul></li> </ul> <h3>3. 温度控制系统</h3> <ul> <li>温度监测: <ul> <li>10KΩ NTC温度传感器(B=3950)</li> <li>ADC电压检测</li> </ul></li> <li>风扇控制: <ul> <li>五档风扇转速控制(0%/10%/30%/60%/100%)</li> <li>温度分段控制策略</li> </ul></li> <li>控制算法: <ul> <li>移动平均滤波(2秒窗口)</li> <li>滞回控制(5秒防震荡)</li> </ul></li> </ul> <h3>4. 用户交互系统</h3> <ul> <li>三按键简洁操作: <ul> <li>KEY1:增加亮度(短按+10%占空比、长按每30ms+1%)</li> <li>KEY2:减少亮度(短按-10%占空比、长按每30ms-1%)</li> <li>KEY3:短按模式切换/长按开关机</li> </ul></li> </ul> <h1><strong>二、项目属性/开源协议</strong></h1> <p>项目首次公开,本人原创,转载商用请联系 仅开源部分源代码和一个可供烧录的固件 使用CC BY-NC-SA 4.0协议 商业应用请联系作者,无许可的商业应用会被追责</p> <h1><strong>三、硬件部分</strong></h1> <p>此部分乏善可陈 使用si2300和2301两颗mos及两颗二极管构建了开关机电路 使用ME6203这颗LDO将不高于40V的电压降压至3.3V 10K的NTC(B=3950)与另一颗10K电阻构成分压电路检测温度 按键板与核心板分离便于设计结构 提供一体的PCB以节约打样时间及费用 <strong>警告:因为SI2300与2301耐压仅支持到20V,故请勿将此方案用于输入电压高于20V的场景,可更换MOS及LDO支持更高的电压</strong></p> <h1><strong>四、软件部分</strong></h1> <h3>1. 系统架构</h3> <pre><code class="language-c">main.c ├── 初始化配置 │ ├── 时钟系统配置(64MHz) │ ├── GPIO初始化(按键/PWM/电源) │ ├── 定时器配置(TIM1/TIM3/TIM14) │ └── ADC初始化(温度采样) ├── 主循环 │ ├── 温度采样系统(100ms周期) │ ├── 风扇控制系统(2秒决策周期) │ └── 电源保护检测 └── 中断系统 ├── TIM14中断(10ms按键扫描) └── ADC完成中断</code></pre> <h3>2. 核心算法实现</h3> <h4>温度计算算法</h4> <pre><code class="language-c">float Read_Temperature(void) { // 获取ADC原始值 uint32_t adc_value = HAL_ADC_GetValue(&hadc1); // 电压转换 (3.3V参考) float voltage = (adc_value * 3.3f) / 4095.0f; // NTC电阻计算 float R_ntc = (voltage * 10000.0f) / (3.3f - voltage); // Steinhart-Hart温度转换 float steinhart = logf(R_ntc / 10000.0f) / 3950.0f + 1.0f / 298.15f; return (1.0f / steinhart) - 273.15f; }</code></pre> <h4>温度滤波与控制</h4> <pre><code class="language-c">// 移动平均滤波器 float Get_Average_Temperature(void) { float sum = 0.0f; for(int i = 0; i < TEMP_AVG_WINDOW; i++) { sum += temp_buffer[i]; } return sum / TEMP_AVG_WINDOW; } // 智能风扇控制 void Update_Fan_Level(float avg_temp) { // 滞回时间检查(5秒内不切换) if(HAL_GetTick() - last_fan_change < FAN_HYSTERESIS_TIME) return; // 温度分段控制逻辑 switch(fan_level) { case 0: if(avg_temp > 40.0f) new_level = 1; break; case 1: if(avg_temp < 38.0f) new_level = 0; else if(avg_temp > 50.0f) new_level = 2; break; // ... 其他档位逻辑 ... } // 档位更新 if(new_level != fan_level) { fan_level = new_level; __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, fan_duty[fan_level] * 32); last_fan_change = HAL_GetTick(); } }</code></pre> <h4>LED通道控制</h4> <pre><code class="language-c">void Handle_Key3_Short(void) { // 保存当前状态 switch(current_channel) { case CH_A: saved_dutyA = dutyA; break; case CH_B: saved_dutyB = dutyB; break; case CH_BOTH: saved_dutyA = dutyA; saved_dutyB = dutyB; break; } // 通道切换 current_channel = (current_channel + 1) % 3; // 恢复新通道状态 switch(current_channel) { case CH_A: dutyA = saved_dutyA; dutyB = 0; // 关闭通道B break; // ... 其他通道处理 ... } // 更新PWM输出 Update_PWM_Output(); }</code></pre> <h3>3. 关键设计特点</h3> <ol> <li> <p><strong>高效的状态管理</strong>:</p> <ul> <li>使用<code>ChannelMode</code>枚举清晰定义通道状态</li> <li>精简的全局变量设计(dutyA/dutyB/saved_dutyA/saved_dutyB)</li> <li>状态切换时自动保存和恢复</li> </ul> </li> <li> <p><strong>实时性能优化</strong>:</p> <ul> <li>10ms高精度按键扫描</li> <li>中断驱动的温度采样</li> <li>非阻塞式主循环设计</li> </ul> </li> <li> <p><strong>模块化设计</strong>:</p> <ul> <li>功能分离:按键处理、PWM控制、温度采样独立封装</li> <li>可扩展接口:易于添加新功能</li> </ul> </li> </ol> <h1><strong>五、复刻注意</strong></h1> <h3>1. 烧录:本项目使用SW烧录,需购买ST-link烧录器,依次链接以下引脚</h3> <ul> <li>GND-GND</li> <li>5V-PWR</li> <li>SWDIO-DIO</li> <li>SWCLK-CLK</li> </ul> <h3>2.焊接</h3> <p>注意STM32G030F6P6引脚比较密集,不要连锡,上电前排查短路情况</p> <h1>六、大赛LOGO及演示视频</h1> <p>请见附件及图片</p>

文档

BOM

暂无

附件

暂无

评论(0)

  • 表情
    emoji
    小嘉工作篇
    小嘉日常篇
  • 图片
成功
工程所有者当前已关闭评论
goToTop
svg-battery svg-battery-wifi svg-books svg-more svg-paste svg-pencil svg-plant svg-ruler svg-share svg-user svg-logo-cn svg-double-arrow