几行代码实现无极调光+电池供电
<h1>简介</h1><p>分享一个使用8G1K08作为主控制作的无极调光灯环。用来做带照明的放大镜;</p>
<h1>原理图</h1>
<h2>主控</h2>
<p>将所有引脚引出,还可以作为其他DIY的验证开发板。</p>
<p><img src="data/attachment/forum/202504/18/213704ah07hvmgg4evz24u.png" alt="image.png" title="image.png" /></p>
<h2>供电</h2>
<p>使用稳压器降压后提供MCU 3.3V电源;</p>
<p><img src="data/attachment/forum/202504/18/213731xgo4giitgzy54pg4.png" alt="image.png" title="image.png" /></p>
<h2>电池充电电路</h2>
<p><img src="data/attachment/forum/202504/18/213938q170x85cw96ofo6t.png" alt="image.png" title="image.png" /></p>
<h2>LED驱动电路</h2>
<p><img src="data/attachment/forum/202504/18/214022lhjvrtzfgdaday8c.png" alt="image.png" title="image.png" /></p>
<h2>调光电位器</h2>
<p><img src="data/attachment/forum/202504/18/214050qvii99i2yygs60lv.png" alt="image.png" title="image.png" /></p>
<h1>程序</h1>
<h2>主程序</h2>
<pre><code>
#include "uart.h"
#include "adc.h"
#include "pwm.h"
#include <stdio.h>
/* 串口发送字节数据函数 参数是你要发送的字节 */
void UartSend_Data(unsigned char dat)
{
SBUF = dat;// 把要发送的数据给了SBUF寄存器
while(!TI);// 等待数据发送完成
TI = 0; // 清除发送完成标志位
}
/* 主函数 */
void main()
{
unsigned int res;
Uart1_Init();
ADC_Init();
PWM_Init();
while(1)
{
DelayMs(200);
res = ADC_Read();
PWM_Duty(res);
}
}
</code></pre>
<h2>PWM 程序</h2>
<pre><code>#include "pwm.h"
void PWM_Init(void)
{
P3M0 &= ~0x20;
P3M1 &= ~0x20;
P_SW1 &= ~(0X20);
P_SW1 |= (0X10); // 切换PCA0 的引脚为P35
CCON = 0X00;
CMOD = 0X0A;
CCAPM0 = 0X42;
PCA_PWM0 |= 0xc0;
CL = 0;
CH = 0;
// 下边的三个值共同绝顶初始占空比
PWM_Duty(1024/2);
CCON |= 0X40;
}
void PWM_Duty(unsigned int adc_value)
{
unsigned char temp_l,temp_h,temp;
temp_l=adc_value&0x00ff; //读pwm_0低8位赋值给temp_l
temp_h=(adc_value&0x0300)>>4; //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0)位置,赋值给temp_h
temp=PCA_PWM0&0xcd; //读PCA_PWM0,XCCAP2H(PCA_PWM0)、EPC0H(PCA_PWM0)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(adc_value==0x03ff) //如果pwm_0最大
{
temp_h|=0x02; //设置EPC0H(PCA_PWM0)为1
}
PCA_PWM0=temp_h; //写PCA_PWM0(先写高2位)
CCAP0H=temp_l; //写CCAP0H(再写低8位)
}
</code></pre>
<h2>ADC 采样</h2>
<pre><code>#include "adc.h"
// 使用P32作为ADC采样口
void ADC_Init(void)
{
P3M0 &= ~0x04; P3M1 |= 0x04; // 配置端口为高祖输入
P_SW2 |= 0X80; // 使能外部扩展寄存器
ADCCFG &= ~0x2f; // ADCCFG = xx0x 0000 SPEED(0)
ADCCFG |= 0x20; // ADCCFG = xx0x 0000 SPEED(0)
ADCTIM = 0x2e; // 配置ADC CSSETUP(0), CSHOLD(1), SMPDUTY(14)
ADC_CONTR = 0X8A; // 开启ADC电源,清除转换结束标志,选择通道10(P32);
}
unsigned int ADC_Read(void)
{
unsigned int res;
ADC_CONTR |= 0X40; // 启动AD转换
_nop_();
_nop_();
while(!(ADC_CONTR&0X20)); // 查询ADC完成标志
ADC_CONTR &= ~0X20;// 清除完成标志
res = (ADC_RES<<8)|ADC_RESL; //读取ADC结果
return res;
}
</code></pre>
<h1>实物图及功能延时</h1>
<h2>实物图</h2>
<p>灯环</p>
<p><img src="data/attachment/forum/202504/18/214523j8je34q8epx9r32v.jpg" alt="灯环.jpg" title="灯环.jpg" /></p>
<p>主控板</p>
<p><img src="data/attachment/forum/202504/18/214524kjjbbyxb8jjpwimx.jpg" alt="电路板.jpg" title="电路板.jpg" /></p>
<h2>功能演示</h2>
<iframe src="https://player.bilibili.com/player.html?isOutside=true&aid=114359292397150&bvid=BV15U5EzYEya&cid=29486091708&p=1&danmaku=0" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>
基于STC8G1K08的无极调光灯环设计与实现
摘要: 本文介绍了一种基于STC8G1K08单片机的无极调光灯环设计方案,该方案利用PWM技术实现LED亮度调节,并集成了电池供电和充电功能,可用于带照明的放大镜等应用场景。
关键词: STC8G1K08,无极调光,PWM,电池供电,LED驱动
1. 引言
无极调光技术能够实现LED亮度的平滑调节,为用户提供更加舒适的照明体验。本文将介绍一种基于STC8G1K08单片机的无极调光灯环设计方案,该方案具有结构简单、成本低廉、易于实现等优点。
2. 系统设计
2.1 硬件设计
主控芯片: 采用STC8G1K08单片机作为主控芯片,该芯片具有高性能、低功耗、丰富的外设资源等优点,能够满足本设计的需求。
供电电路: 使用稳压器将电池电压降压至3.3V,为单片机和其他电路提供稳定的电源。
电池充电电路: 设计简单的电池充电电路,方便用户为电池充电。
LED驱动电路: 使用MOS管驱动LED,实现LED亮度的调节。
调光电位器: 使用电位器调节PWM占空比,从而实现LED亮度的无极调节。
2.2 软件设计
主程序: 主程序负责初始化各个外设,并循环读取电位器值,根据电位器值调整PWM占空比,从而控制LED亮度。
PWM程序: PWM程序负责配置PWM模块,并设置PWM占空比。
3. 代码实现
3.1 主程序
c
include "uarth"
include "adch"
include "pwmh"
include
/ 串口发送字节数据函数 参数是你要发送的字节 /
void UartSendData(unsigned char dat)
{
SBUF = dat;// 把要发送的数据给了SBUF寄存器
while(!TI);// 等待数据发送完成
TI = 0; // 清除发送完成标志位
}
/ 主函数 /
void main()
{
unsigned int res;
Uart1Init();
ADCInit();
PWMInit();
while(1)
{
DelayMs(200);
res = ADCRead();
PWMDuty(res);
}
}
3.2 PWM程序
c
include "pwmh"
void PWMInit(void)
{
P3M0 &= ~0x20;
P3M1 &= ~0x20;
PSW1 &= ~(0X20);
PSW1 |= (0X10); // 切换PCA0 的引脚为P35
CCON = 0x00; // 清除PCA计数器溢出标志位
CMOD = 0x02; // 设置PCA时钟源为系统时钟/2
CCAPM0 = 0x42; // 设置PCA模块0为PWM模式
CCAP0L = 0x00; // 设置PWM占空比初始值为0
CCAP0H = 0x00; // 设置PWM占空比初始值为0
CR = 1; // 启动PCA计数器
}
void PWMDuty(unsigned int duty)
{
CCAP0L = duty & 0xFF; // 设置PWM占空比低8位
CCAP0H = (duty >> 8) & 0xFF; // 设置PWM占空比高8位
}
4. 总结
本文介绍了一种基于STC8G1K08单片机的无极调光灯环设计方案,该方案利用PWM技术实现LED亮度调节,并集成了电池供电和充电功能。该方案具有结构简单、成本低廉、易于实现等优点,可用于带照明的放大镜等应用场景。
5. 未来工作
未来可以对该方案进行以下改进:
增加更多的LED灯珠,提高照明亮度。
增加多种调光模式,例如呼吸灯模式、闪烁模式等。
增加无线控制功能,方便用户远程控制灯环。
参考文献
STC8G1K08单片机数据手册
PWM技术原理与应用
LED驱动电路设计
致谢
感谢STC公司提供的技术支持。
[本文内容由国芯人工智能辅助生成,仅供参考]
页:
[1]