历史上的今天
返回首页

历史上的今天

今天是: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);//设置捕获比较寄存器的值

推荐阅读

史海拾趣

Churod Electronics Co Ltd公司的发展小趣事

随着公司规模的扩大,中汇瑞德意识到,要想在激烈的市场竞争中保持领先地位,必须不断进行科技创新。于是,公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。在研发团队的努力下,公司成功开发出了多款具有自主知识产权的新型继电器产品,不仅提高了产品的性能和质量,还降低了生产成本,赢得了客户的广泛好评。

Device Engineering Incorporated公司的发展小趣事

在追求技术创新的同时,DEI公司也注重品质管理和品牌塑造。公司建立了严格的质量管理体系,对每一个生产环节都进行严格的把控。同时,DEI公司也注重品牌形象的塑造,通过参与公益活动、举办技术研讨会等方式,提升了公司的社会形象。这些举措不仅增强了客户对公司的信任度,也为公司的长远发展奠定了坚实的基础。

Herga公司的发展小趣事

在20世纪90年代初,Herga公司凭借其在精密电机技术上的突破,成功研发出一款高效能、低噪音的步进电机,迅速在自动化设备和电子设备市场中脱颖而出。这款电机不仅提高了生产效率,还显著降低了能耗和噪音水平,赢得了众多知名电子制造商的青睐。Herga公司借此机会,进一步拓展产品线,逐步确立了在电子行业精密传动组件领域的领先地位。

ARCOLECTRICSWITCHES公司的发展小趣事

随着电子行业的不断发展,ARCOLECTRIC SWITCHES公司意识到单打独斗已经无法满足市场需求。因此,公司积极寻求与上下游企业的合作,共同打造完善的产业链。通过与供应商建立长期稳定的合作关系,确保原材料的稳定供应;与下游企业开展深度合作,共同研发新产品、开拓新市场。这种合作共赢的模式使得ARCOLECTRIC SWITCHES公司在行业中更具竞争力。

Aborn Electronics Inc公司的发展小趣事

Aborn Electronics Inc公司创立之初,面临着资金短缺、市场竞争激烈和技术壁垒等多重挑战。创始人凭借对电子技术的深厚理解和对市场需求的敏锐洞察,带领团队攻克了一个又一个技术难关。公司最初的产品线集中在电子元器件的生产和供应上,通过优化生产流程和降低成本,逐渐在市场上站稳了脚跟。同时,Aborn Electronics积极与各大电子厂商建立合作关系,为公司的长远发展奠定了坚实的基础。

C&K Components公司的发展小趣事

到了90年代,随着电子产品的普及和技术的进步,开关市场的竞争愈发激烈。然而,C&K凭借多年的技术积累和市场经验,已经成为世界领先的开关制造商之一。公司不断推出创新产品,满足市场的多样化需求,同时加强与国际知名企业的合作,进一步巩固了其在行业内的领先地位。

问答坊 | AI 解惑

LED显示屏技术现状及发展

LED显示屏是发光二极管主要应用领域之一,近年来发展迅速。目前,LED显示屏制作技术先进,售价低,国外公司很难在大陆竞争市场。据不完 全统计,1998年我国LED显示屏生产厂商有150多家,制造各类显示屏约五万平方米,实现产值14亿元,LED产业取得 ...…

查看全部问答>

更改频率与DMA

在切换CORE和内存频率时,需要考虑DMA数据传输的问题吗?就是指是否可能将当前正传输的数据丢掉。…

查看全部问答>

wince代码移植问题【1】:怎样处理locale头文件?

移植一段代码时候用到了StdString.h 其中用到了 locale头文件。 wince不支持stl的locale,应该是提供了它自己的方法,但苦于小弟刚学C++和WinCe,搜索两天时间还未找 到结果,恳请各位帮忙...…

查看全部问答>

突破白光LED国际专利壁垒的有效途径

 传统的照明技术是在电真空技术的基础上发展起来的,由于半导体技术的发展,电子管的电子元件逐步被晶体管所替代。和晶体管元件一样,固态照明产品与传统的照明产品相比,有明显的优势。随着节能、环保型照明需求的日益提高,白光LED在全世界范围 ...…

查看全部问答>

51代码求助,关于中断的。

//=====================================================================////                      红外遥控器解码程序演示                 ...…

查看全部问答>

《GPSR+GPS开发板》之一透明传输

之前本人把自己DIY的《GPSR+GPS开发板》开发板Show出来,可程序一直没有完成。所以,代码至今没有开源。后面我们将逐步把相关内容贴上论坛,敬请关注。…

查看全部问答>

ARM

各位大神好,小弟现在有个疑问:                                              &nb ...…

查看全部问答>

FATFS BMP

大家好:           我使用了TIVA 单片机里的SD_demo,里面的FATFS已经移植好了,我现在希望SD卡里面的单色BMP图片转成像素数组,下面是我的程序,我通过DEBUG发现在f_lseek()函数后的if(res==FR_OK)语句是没办法执 ...…

查看全部问答>

关于msp430之去除抖动

问题描述:小弟最近在玩msp430,使用一个红外模块测量液体的滴定数目counter_val 由于液体的形状,速度等导致单片机接收到的IO中断有抖动,小弟想使用一个延时,之前直接使用软件延时效果不是很好,听网上大神的意见:小弟想使用定时器中断来做 问 ...…

查看全部问答>

28335 ADC, AD引脚电平一直正常且未变,为何某些情况下采样值会变小?

折磨了快一个月了。到底是什么问题?ADC使用的是内部参考,外围电路正确。是电源和GND受到干扰吗?为何引脚电平一直是OK的?是DSP内部参考电压异常吗?另外,ADC计算的公式:(Vin-Vadclo)/3*4096,这个式子里面,VIN和VADCLO都用示波器确认过,OK, ...…

查看全部问答>