历史上的今天
今天是:2025年01月29日(星期三)
2020年01月29日 | STM8S的按键PWM调光灯历程
2020-01-29 来源:eefocus
STM8SPWM应用
前几天有个项目用到PWM,今天整理下,弄个氛围灯;记录下,以后忘记了返回来还能看看。
思路就是在硬件端设置个按键,按下全局变量Key_num的值+1,按键一开始我用轮询法做的,后来觉得轮询法延时可能导致未知的问题,现在用中断法做;根据Key_num的值,用switch语句选择要变换的模样。
上代码:
/*****************************************************************************
* @function : Tim2_Init
* @brief : TIM2初始化函数 CH1用作出LED——G的呼吸变化灯
* @note : STM8S005
* @param : null
* @retval : null
* @author : 2016.03.23 by Steam.Yang
2016.11.02 RPP 学习并增加注释
******************************************************************************/
void Tim2_Init(void) //TIM2的初始化语句们
{
//配置通道1
TIM2_TimeBaseInit(TIM2_PRESCALER_8, 999); //第一步配置时基单元,先设置预分频PSCRH/L高低八位 寄存器,再设置自动装载寄存器ARRH/L。
TIM2_OC1Init(TIM2_OCMODE_PWM1,
TIM2_OUTPUTSTATE_ENABLE,
0,
TIM2_OCPOLARITY_LOW); //然后配置通道的输出模式为PWM,启用输出比较,占空比设置为0,输出为低电平
TIM2_OC1PreloadConfig(ENABLE);
TIM2_Cmd(ENABLE);
//配置通道2
TIM2_TimeBaseInit(TIM2_PRESCALER_8, 999); //第一步配置时基单元,先设置预分频PSCRH/L高低八位 寄存器,再设置自动装载寄存器ARRH/L。
TIM2_OC2Init(TIM2_OCMODE_PWM1,
TIM2_OUTPUTSTATE_ENABLE,
0,
TIM2_OCPOLARITY_LOW); //然后配置通道的输出模式为PWM,启用输出比较,占空比设置为0,输出为(低电平).105s4是低电平点亮
TIM2_OC2PreloadConfig(ENABLE); //开启预装载寄存器
TIM2_Cmd(ENABLE); //最后的开启 启用定时器
//配置通道3
TIM2_TimeBaseInit(TIM2_PRESCALER_8, 999); //第一步配置时基单元,先设置预分频PSCRH/L高低八位 寄存器,再设置自动装载寄存器ARRH/L。
TIM2_OC3Init(TIM2_OCMODE_PWM1,
TIM2_OUTPUTSTATE_ENABLE,
0,
TIM2_OCPOLARITY_LOW); //然后配置通道的输出模式为PWM,启用输出比较,占空比设置为0,输出为低电平
TIM2_OC3PreloadConfig(ENABLE);
TIM2_Cmd(ENABLE);
}
这段代码为PWM初始化代码,被折腾了好几天,手头上的105S4跟别人就是不一样,他非要低电平点亮小灯。。。。,心累这段代码比较重要。
下面的是主函数
int main( void )
{
CLK_HSICmd(ENABLE); //配置个时钟先
GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT);//初始化按键的GPIO口 上拉输入
Tim2_Init(); //再初始化TIM2 PWM1输出模式
while(1)
{
Key_Press(); //再调用按键
//再给PWM呼吸灯占空比的值
if((!sta) && (PWM<1000)) //比较好的循环
{
PWM++;
if(PWM == 1000) sta = 1;
}
if((sta) && (PWM>0))
{
PWM--;
if(PWM == 0) sta = 0;
}
Delay_Us(500); //延时调整呼吸的速度
switch(Key_num){
case 0: //没有按下 或者按到第7下时 全灭,进行清零
TIM2_SetCompare1(0);
TIM2_SetCompare2(0);
TIM2_SetCompare3(0);
break;
case 1:
TIM2_SetCompare1(1000); //按第一下,计数1, W灯常亮1 (1000常亮 PWM呼吸 0关闭)
break;
case 2: //按第二下,计数2,W灯呼吸2
//TIM2_Cmd(DISABLE);//本来想关掉PWM来进行关闭灯亮,结果不能关,关了后面就不执行了 要重新做初始化 要做其他处理
TIM2_SetCompare1(PWM);
break;
case 3:
TIM2_SetCompare1(0);
TIM2_SetCompare2(1000); //按三下,计数3,G灯常亮 ,同时要关掉前面亮着的
break;
case 4: //按四下,计数4,G灯呼吸
TIM2_SetCompare2(PWM); //
break;
case 5:
TIM2_SetCompare2(0); //按第五下,计数5,B灯常亮
TIM2_SetCompare3(1000); //
break;
case 6: //按第六下,计数6,B灯呼吸
TIM2_SetCompare3(PWM); //
break;
case 7: //全呼吸
TIM2_SetCompare1(PWM);
TIM2_SetCompare2(PWM);
`
TIM2_SetCompare3(PWM);
}
}
}
PWM不能关 关了就要重新初始化,所以选变成0 他就不亮了。这个循环结构是非常好的循环结构,很多书上的循环结构都是从0-100 没有100-0 灯呼吸很突兀,所以建议用这种。
中断的按键函数
放在中断里面
if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) == 0)
{
delay_us(5000); //去抖延时
if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) == 0)
{
while(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) == 0);
Key_num++;
if(Key_num == 2)
{
Key_num=0;
}
}
}
写完了,有什么再补充吧,
吐槽这鬼编译器,恶心 好几次都代码上不去
补充:
我师父教我的 哈哈
首先该计数器,循环技术,例如从0到ARR,那么这个ARR就决定了PWM的周期,
PWM周期=(ARR+1)*计数器时钟的周期.
PWM频率=计数器时钟的频率/(ARR+1)
在计数器模块中还有一个比较器,比较器有两个输入,一个是计数器的当前值,另一个是可以设置的数,这个数来着一个比较寄存器.当计数器的值小于比较寄存器的值时,输出为1(也可以是0),当计数器的值大于或者等于比较器寄存器的值时,输出为0(也可以是1,与前面对应).
STM8–PWM初始化流程
1、时基初始化,得出PWM的频率(周期)
2、初始化输出比较通道,确定是哪个模式、通道、脉冲宽度(确定占空比)、和电平。
3、输出比较通预装载使能
4、允许主输出(TIM1)
5、使能定时器
随时改变PWM频率:
void TIM1_SetAutoreload(uint16_t Autoreload);//设置自动重装寄存器的值
随时改变占空比:
TIM1_SetCompare1(0x0000);//设置捕获比较寄存器的值
史海拾趣
|
LED显示屏是发光二极管主要应用领域之一,近年来发展迅速。目前,LED显示屏制作技术先进,售价低,国外公司很难在大陆竞争市场。据不完 全统计,1998年我国LED显示屏生产厂商有150多家,制造各类显示屏约五万平方米,实现产值14亿元,LED产业取得 ...… 查看全部问答> |
|
移植一段代码时候用到了StdString.h 其中用到了 locale头文件。 wince不支持stl的locale,应该是提供了它自己的方法,但苦于小弟刚学C++和WinCe,搜索两天时间还未找 到结果,恳请各位帮忙...… 查看全部问答> |
|
传统的照明技术是在电真空技术的基础上发展起来的,由于半导体技术的发展,电子管的电子元件逐步被晶体管所替代。和晶体管元件一样,固态照明产品与传统的照明产品相比,有明显的优势。随着节能、环保型照明需求的日益提高,白光LED在全世界范围 ...… 查看全部问答> |
|
//=====================================================================//// 红外遥控器解码程序演示 ...… 查看全部问答> |
|
之前本人把自己DIY的《GPSR+GPS开发板》开发板Show出来,可程序一直没有完成。所以,代码至今没有开源。后面我们将逐步把相关内容贴上论坛,敬请关注。… 查看全部问答> |
|
问题描述:小弟最近在玩msp430,使用一个红外模块测量液体的滴定数目counter_val 由于液体的形状,速度等导致单片机接收到的IO中断有抖动,小弟想使用一个延时,之前直接使用软件延时效果不是很好,听网上大神的意见:小弟想使用定时器中断来做 问 ...… 查看全部问答> |
|
28335 ADC, AD引脚电平一直正常且未变,为何某些情况下采样值会变小? 折磨了快一个月了。到底是什么问题?ADC使用的是内部参考,外围电路正确。是电源和GND受到干扰吗?为何引脚电平一直是OK的?是DSP内部参考电压异常吗?另外,ADC计算的公式:(Vin-Vadclo)/3*4096,这个式子里面,VIN和VADCLO都用示波器确认过,OK, ...… 查看全部问答> |




