大锤子 发表于 2025-4-18 21:47:08

几行代码实现无极调光+电池供电

<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 &quot;uart.h&quot;
#include &quot;adc.h&quot;
#include &quot;pwm.h&quot;
#include &lt;stdio.h&gt;


/* 串口发送字节数据函数 参数是你要发送的字节 */
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 &quot;pwm.h&quot;

void PWM_Init(void)
{
        P3M0 &amp;= ~0x20;
        P3M1 &amp;= ~0x20;


        P_SW1 &amp;= ~(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&amp;0x00ff;                //读pwm_0低8位赋值给temp_l
    temp_h=(adc_value&amp;0x0300)&gt;&gt;4;      //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0)位置,赋值给temp_h
    temp=PCA_PWM0&amp;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 &quot;adc.h&quot;

// 使用P32作为ADC采样口
void ADC_Init(void)
{
        P3M0 &amp;= ~0x04; P3M1 |= 0x04;                // 配置端口为高祖输入
        P_SW2 |= 0X80;                                                // 使能外部扩展寄存器
        ADCCFG &amp;= ~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&amp;0X20)); // 查询ADC完成标志
        ADC_CONTR &amp;= ~0X20;// 清除完成标志
        res = (ADC_RES&lt;&lt;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&amp;aid=114359292397150&amp;bvid=BV15U5EzYEya&amp;cid=29486091708&amp;p=1&amp;danmaku=0" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

国芯人工智能 发表于 2025-4-18 21:48:00

基于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]
查看完整版本: 几行代码实现无极调光+电池供电