目的
利用pwm实现呼吸为灯效果
实验环境
TBK-RD8T3x开发板
实现原理
RD8T37单片机最多提供 14 路 PWM,这 14路 PWM 分为两类:多功能 PWM:共8路,只有一组,即 PWM0,输出信号口为: PWM0 0~07。
我们只需要修改PWM0的占空比就可以实现LED灯的亮度。
实现步骤
1、在keil工程加入rd8_pwm.c
2、根据数据手册与原理图,我这里选用P42为PWM输出:
3、初始化PWM0通道5
/*****************************************************
*函数名称: SC_PWM0_Init
*函数功能: PWM0初始化函数
*入口参数:void
*出口参数:void
*****************************************************/
void SC_PWM0_Init(void)
{
/*PWM0独立模式*/PWM_Init(PWM0_PRESSEL_FHRC_D1,255);
/*PWM00 独立模式*/PWM_IndependentModeConfigEX(PWM05,0, PWM_OUTPUTSTATE_ENABLE);
/*PWM0*/PWM_Aligned_Mode_Select(PWM0_Edge_Aligned_Mode);
/*PWM0*/PWM_FaultDetectionConfigEX(PWM0_Type,DISABLE);
/*PWM0*/PWM_FaultDetectionModeConfigEX(PWM0_Type,PWM0_Immediate_Mode,PWM0_FaultDetectionVoltage_Low,PWM0_WaveFilteringTime_0us);
/*PWM0中断使能*/PWM_ITConfigEX(PWM0_Type,DISABLE,LOW);
/*PWM0开关*/PWM_CmdEX(PWM0_Type,ENABLE);
/*PWM0_Init write here*/
}
4、动态修改占空比的函数为:
PWM_IndependentModeConfig(PWM05,pwm_num);
5、为了达到非阻塞式的动态修改占空比,以达到实现呼吸灯的效果,我附了main.c的代码如下:
#include "rd8.h"
#include "rd8_pwm.h"
uint8_t sta;
uint32_t count = 0;
void LED_Init(void)
{
P3CON |= 0x1E; //P3 0b0001 1110 输出
P4CON |= 0x0F; //P4 0b0000 1111
}
void Timer0Iint(void)
{
TMOD |= 0x01; // 配置定时器0为 16位定时器, TH0、TL0全用
TH0 =(65536-1000)/256; //1000us定时,即1毫秒溢出产生中断
TL0 =(65536-1000)%256; //1000us定时,即1毫秒溢出产生中断
ET0 = 1; //开启定时器0中断
EA = 1; //开启全局中断
TR0 = 1; //定时器0开始计数;
}
/*****************************************************
*函数名称: SC_PWM0_Init
*函数功能: PWM0初始化函数
*入口参数:void
*出口参数:void
*****************************************************/
void SC_PWM0_Init(void)
{
/*PWM0独立模式*/PWM_Init(PWM0_PRESSEL_FHRC_D1,255);
/*PWM00 独立模式*/PWM_IndependentModeConfigEX(PWM05,0, PWM_OUTPUTSTATE_ENABLE);
/*PWM0*/PWM_Aligned_Mode_Select(PWM0_Edge_Aligned_Mode);
/*PWM0*/PWM_FaultDetectionConfigEX(PWM0_Type,DISABLE);
/*PWM0*/PWM_FaultDetectionModeConfigEX(PWM0_Type,PWM0_Immediate_Mode,PWM0_FaultDetectionVoltage_Low,PWM0_WaveFilteringTime_0us);
/*PWM0中断使能*/PWM_ITConfigEX(PWM0_Type,DISABLE,LOW);
/*PWM0开关*/PWM_CmdEX(PWM0_Type,ENABLE);
/*PWM0_Init write here*/
}
void main(void)
{
//LED_Init();
uint8_t pwm_num;
uint8_t f;
SC_PWM0_Init();
Timer0Iint();
f=0;
pwm_num = 0;
while(1)
{
if(sta ==1)
{
sta = 0;
if(f ==0)
{
pwm_num++;
PWM_IndependentModeConfig(PWM05,pwm_num);
}
else if (f ==1)
{
pwm_num--;
PWM_IndependentModeConfig(PWM05,pwm_num);
}
if(pwm_num == 255)
{
f = 1;
}
else if(pwm_num == 0)
{
f = 0;
}
}
}
}
void Timer0() interrupt 1
{
//每次产生中断后初始化定时器初值, 1ms秒产生1次中断
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
count ++;
if(count == 10)
{
sta =1;
count = 0;
}
}
实现效果
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
led
+关注
关注
240文章
23128浏览量
658248 -
PWM
+关注
关注
114文章
5140浏览量
213358 -
呼吸灯
+关注
关注
10文章
110浏览量
42703
发布评论请先 登录
相关推荐
PWM实现呼吸灯效果
){ analogWrite(11,a); delay(8);//当前亮度的维持的时间,单位毫秒 }delay(800);//完成一个循环后等待的时间,单位毫秒}很简单很简单的几句代码就能实现呼吸灯~然后,我们将程序下载到Ard
发表于 07-20 15:03
基于CPLD/FPGA的呼吸灯效果实现_呼吸灯源码_明德扬资料
特效呼吸灯1功能概述顾名思义,特效呼吸灯是指在电路控制之下,LED灯光完成由灭到亮、由亮到灭的逐渐变化,感觉像是在
发表于 08-02 18:03
使用PWM控制LED实现呼吸灯的效果
, then set pwm value to highpwm_r elsepwm_r endend那么如何实现呼吸灯的效果呢?我们知道
发表于 01-06 17:43
请问一下STM32 PWM是如何去实现呼吸灯设计的
STM32 PWM实现呼吸灯使用STM32F103ZET6 定时器4 CH2通道产生PWM波,在GPIOD,GPIO_PIN13引脚
发表于 02-21 07:30
【Banana PI Leaf S3开发板试用体验】PWM 调节LED的呼吸灯效果
在BPI-Leaf-S3开发板上要实现呼吸灯效果非常容易,只需几个简单的函数调用即可。由于开发板上配置的是全彩LED
发表于 10-19 12:28
STM32 使用PWM实现呼吸灯
STM32 PWM实现呼吸灯使用STM32F103ZET6 定时器4 CH2通道产生PWM波,在GPIOD,GPIO_PIN13引脚
发表于 12-24 19:41
•55次下载
评论