利用新定义触摸芯片的功能,很适合做一个触控的设备,接下来用TBK-RD8T3x开发板实现一个简单地RGB调光灯,使用滑条调节亮度,6个按键切换灯光颜色
利用PWM通过调节占空比调节RGB三路灯光的亮度,选定P50 P51 P523个IO分别作为RGB的PWM输出引脚,对应PWM00 PWM01 PWM02
由于没有RD LINK无法调试触摸功能,这里直接在测试例程的基础上添加调光的代码
打开TBK-RD8T3x Demo Code这个工程(需要提前安装好Keil C51和RD_KEIL插件,不然打开后会提示找不到芯片,之后也无法编译),添加TBK-RD8T3x Demo Code\FWLib\RD8_Lib\src中的rd8_pwm.c到工程中,接下来要用到这个文件中的方法配置和控制PWM
使用到的3个PWM属于PWM0通路,在SC_Init.c的SC_Init方法中添加SC_PWM0_Init();
在SC_PWM0_Init方法中添加PWM初始化代码,使用新定义提供的库函数可以方便直观地进行配置
void SC_PWM0_Init(void)
{
//Forbid editing areas before the following label !!!
/*PWM0_Init write here*/
PWM_Init(PWM0_PRESSEL_FHRC_D1,10000); //初始化PWM周期10000
PWM_Aligned_Mode_Select(PWM0_Edge_Aligned_Mode); //PWM边沿对齐
PWM_OutputStateConfig(PWM00,PWM_OUTPUTSTATE_ENABLE);
PWM_OutputStateConfig(PWM01,PWM_OUTPUTSTATE_ENABLE);
PWM_OutputStateConfig(PWM02,PWM_OUTPUTSTATE_ENABLE);
PWM_PolarityConfig(PWM00,PWM_POLARITY_NON_INVERT);
PWM_PolarityConfig(PWM01,PWM_POLARITY_NON_INVERT);
PWM_PolarityConfig(PWM02,PWM_POLARITY_NON_INVERT);
PWM_IndependentModeConfig(PWM00,10000);
PWM_IndependentModeConfig(PWM01,10000);
PWM_IndependentModeConfig(PWM02,10000);
PWM_CmdEX(PWM0_Type,ENABLE); //开启PWM
}
解释一下几个方法的含义:
PWM_Init(PWM_PresSel_TypeDef PWM_PresSel, uint16_t PWM_Period):初始化PWM,输入函数为预分频选择和周期,预分频可选参数如图
PWM_Aligned_Mode_Select(PWM_Aligned_Mode_TypeDef PWM_Aligned_Mode):PWM对齐模式设置,可选边沿对齐PWM0_Edge_Aligned_Mode或中心对齐PWM0_Center_Alignment_Mode
PWM_OutputStateConfig(uint8_t PWM_OutputPin, PWM_OutputState_TypeDef PWM_OutputState):PWMxx引脚输出使能配置,可配置成PWM_OUTPUTSTATE_DISABLE或PWM_OUTPUTSTATE_ENABLE,PWMxx的引脚选择如图
PWM_PolarityConfig(uint8_t PWM_OutputPin, PWM_Polarity_TypeDef PWM_Polarity):PWMxx正反向输出配置,可配置成PWM_POLARITY_NON_INVERT或PWM_POLARITY_INVERT
PWM_IndependentModeConfig(PWM_OutputPin_TypeDef PWM_OutputPin, uint16_t PWM_DutyCycle):PWMxx独立工作模式占空比配置
接下来在触控处理方法中加入PWM调节方法,顺便修改一下开发板上LED的亮起逻辑,上面的滑条LED改为在手指离开滑条后LED仍保持亮起作为亮度提示,下面的六个LED改为每次点击后只有点击的LED亮起作为模式选择提示
打开SysFunVarDefine.c,里面LED_ALLOFF和Level0-7是处理滑条LED的,UpdateDisplay中有下面6个LED的处理
使用4个变量分别存放RGB分量和亮度,新建个方法用来设置RGB和亮度
//RGB分量和亮度
uint16_t light_r = 10000;
uint16_t light_g = 10000;
uint16_t light_b = 10000;
uint8_t light_l = 100;
void set_lightrgbl(uint16_t r,uint16_t g,uint16_t b,uint8_t l)
{
float fl = l/100.0;
light_r = r;
light_g = g;
light_b = b;
light_l = l;
PWM_IndependentModeConfig(PWM00,light_r*fl);
PWM_IndependentModeConfig(PWM01,light_g*fl);
PWM_IndependentModeConfig(PWM02,light_b*fl);
}
在触控处理方法中调用set_lightrgbl方法修改颜色和亮度就行了
最终运行效果
|
赞一个