描述
<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>
评论(0)