找回密码
 立即注册
查看: 294|回复: 3

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-06-16 10:36:40

46

主题

232

回帖

3089

积分

论坛元老

积分
3089
发表于 2025-4-18 21:47:08 | 显示全部楼层 |阅读模式

简介

分享一个使用8G1K08作为主控制作的无极调光灯环。用来做带照明的放大镜;

原理图

主控

将所有引脚引出,还可以作为其他DIY的验证开发板。

image.png

供电

使用稳压器降压后提供MCU 3.3V电源;

image.png

电池充电电路

image.png

LED驱动电路

image.png

调光电位器

image.png

程序

主程序


#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);
	}
}



PWM 程序

#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[5:4])位置,赋值给temp_h
    temp=PCA_PWM0&0xcd;                        //读PCA_PWM0,XCCAP2H(PCA_PWM0[5:4])、EPC0H(PCA_PWM0[1])清零后赋值给temp
    temp_h|=temp;                                //写其他位到temph
    if(adc_value==0x03ff)                        //如果pwm_0最大
	{
		temp_h|=0x02;                        //设置EPC0H(PCA_PWM0[1])为1
	}
  
    PCA_PWM0=temp_h;                        //写PCA_PWM0(先写高2位)
    CCAP0H=temp_l;                                //写CCAP0H(再写低8位)
}

ADC 采样

#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;
}

实物图及功能延时

实物图

灯环

灯环.jpg

主控板

电路板.jpg

功能演示

不争是争
回复

使用道具 举报 送花

3

主题

714

回帖

139

积分

等待验证会员

积分
139
发表于 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 主程序
  1. c
  2. include "uarth"
  3. include "adch"
  4. include "pwmh"
  5. include
  6. / 串口发送字节数据函数 参数是你要发送的字节 /
  7. void UartSendData(unsigned char dat)
  8. {
  9.         SBUF = dat;  // 把要发送的数据给了SBUF寄存器
  10.         while(!TI);  // 等待数据发送完成
  11.         TI = 0;      // 清除发送完成标志位
  12. }
  13. / 主函数 /
  14. void main()
  15. {
  16.         unsigned int res;
  17.         Uart1Init();
  18.         ADCInit();
  19.         PWMInit();
  20.         while(1)
  21.         {
  22.                 DelayMs(200);
  23.                 res = ADCRead();
  24.                 PWMDuty(res);
  25.         }
  26. }
复制代码

3.2 PWM程序
  1. c
  2. include "pwmh"
  3. void PWMInit(void)
  4. {
  5.         P3M0 &= ~0x20;
  6.         P3M1 &= ~0x20;
  7.         PSW1 &= ~(0X20);
  8.         PSW1 |= (0X10);                // 切换PCA0 的引脚为P35
  9.         CCON = 0x00;                        // 清除PCA计数器溢出标志位
  10.         CMOD = 0x02;                        // 设置PCA时钟源为系统时钟/2
  11.         CCAPM0 = 0x42;                        // 设置PCA模块0为PWM模式
  12.         CCAP0L = 0x00;                        // 设置PWM占空比初始值为0
  13.         CCAP0H = 0x00;                        // 设置PWM占空比初始值为0
  14.         CR = 1;                                        // 启动PCA计数器
  15. }
  16. void PWMDuty(unsigned int duty)
  17. {
  18.         CCAP0L = duty & 0xFF;        // 设置PWM占空比低8位
  19.         CCAP0H = (duty >> 8) & 0xFF;        // 设置PWM占空比高8位
  20. }
复制代码

4. 总结

本文介绍了一种基于STC8G1K08单片机的无极调光灯环设计方案,该方案利用PWM技术实现LED亮度调节,并集成了电池供电和充电功能。该方案具有结构简单、成本低廉、易于实现等优点,可用于带照明的放大镜等应用场景。

5. 未来工作

未来可以对该方案进行以下改进:

增加更多的LED灯珠,提高照明亮度。
增加多种调光模式,例如呼吸灯模式、闪烁模式等。
增加无线控制功能,方便用户远程控制灯环。

参考文献

[1] STC8G1K08单片机数据手册

[2] PWM技术原理与应用

[3] LED驱动电路设计

致谢

感谢STC公司提供的技术支持。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:167
  • 最近打卡:2025-06-17 00:02:12

122

主题

162

回帖

369

积分

中级会员

积分
369
发表于 2025-5-14 21:21:31 | 显示全部楼层
我这个二五手不理解,这个工程不需要PWM 头文件和ADC 头文件吗?,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-06-16 10:36:40

46

主题

232

回帖

3089

积分

论坛元老

积分
3089
发表于 2025-5-15 17:54:47 | 显示全部楼层
cjt*** 发表于 2025-5-14 21:21
我这个二五手不理解,这个工程不需要PWM 头文件和ADC 头文件吗?,

直接操作寄存器,要啥自行车。哈哈哈啊哈
不争是争
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 02:16 , Processed in 1.082129 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表