历史上的今天
返回首页

历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2021年09月22日 | STM8学习笔记---PWM变频输出

2021-09-22 来源:eefocus

在使用STM8的PWM功能时,一般都是改变占空比来改变输出电压大小。但是有时候不需要改变PWM的占空比,而是需要按照一定的规律改变输出PWM的频率,而占空比保持不变。现在总结一下如何实现STM8单片机输出PWM波时动态改变频率。

直接看C代码的实现


#include "pwm.h"

u16  FRE = 100;             //frequency  频率 4M / 100 = 40K   

void PWM_GPIO_Init( void )

{

    PC_DDR |= ( 1 << 7 );       //PC7 推挽输出

    PC_CR1 |= ( 1 << 7 );

}

void TIM1_Init( void )

{

    PWM_GPIO_Init();

    TIM1_CR1 = (1<<7);                        //自动预装载允许

    

    TIM1_CCMR2 = (6<<4)|(1<<3)|(1<<2);        //TIM1 CH2 PWM1  输出比较1预装载使能  输出比较1 快速使能

    TIM1_CCER1 |= 0x10;                       //CC2为输出 高电平有效    

    

    TIM1_PSCRH = 0x00;                        //预分频 0 

    TIM1_PSCRL = 0x03;                        //16M/(1+3)=4 M

    

    TIM1_ARRH = FRE >> 8;                     //设定自动重装载值高8位

    TIM1_ARRL = FRE;                          //设置自动重装载值低8位

  

    TIM1_BKR = 0x80;                            //刹车寄存器 使能OC1输出 定时器不工作时输出无效电平

    TIM1_EGR = (1<<0);                        //产生更新事件

    TIM1_CR1 |= 0x01;                           //使能计数器

}

//TIM1 CH2  PC7

void TIM1_CH2_FRE_DC_Change( unsigned int freq, unsigned int dc )

{

    TIM1_ARRH = freq >> 8;                     //设置频率

    TIM1_ARRL = freq;

    TIM1_CCR2H = dc >> 8;

    TIM1_CCR2L = dc;

}


首先初始化PWM口,这里使用的是定时器1通道2,也就是PC7口,下来初始化定时器,将定时器1通道2设置为PWM功能,这里记住一定要开启自动预装载功能,不开起预装载功能,直接改变ARR寄存器的值时,输出的频率也能发生改变,但是输出的PWM波形有时候会出现丢失现象,也就是会有一段时间无波形输出,开启自动预装载功能后,放入ARR寄存器的值不会立即发生改变,而是在更新ARR的值时才发生改变,这样在变频时就能保证输出的每个周期波形都是完整的,不会出现输出PWM波形丢失现象。


初始化完定定时器后,将频率和占空比的设置单独封装一个函数,这样需要变频的时候,直接调用这个函数就行。


定时器的时钟设置为4MHz,ARR寄存器的值设置为100时,输出频率为4M/100=40KHz,当ARR寄存器的值设置为1000时,输出频率为4MHz/1000=4KHz,这样当ARR的值在100到1000之间连续变化时,输出的PWM频率就会在40K到4K之间连续变化。


主程序代码如下


#include "iostm8s103F3.h"

#include "led.h"

#include "pwm.h"

 

 

void SysClkInit( void )

{

    CLK_SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率

    CLK_CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频

}

 

void main( void )

{

    unsigned int i = 0;

    SysClkInit();

    __asm( "sim" );

    TIM1_Init();

    __asm( "rim" );

    while( 1 )

    {

        for( i = 100; i < 1000; i++ )

        {

            TIM1_CH2_FRE_DC_Change( i, i / 2 );            

        }

    }

}


主程序的主要功能就是循环调用TIM1_CH2_FRE_DC_Change()函数来改变频率和占空比,在本例程中将占空比的值设置为频率的一半,这样在任何频率下占空比都是50%。ARR寄存器值设置为100到1000循环变化,这样输出的PWM频率就会在40K到4K之间循环变化。


输出PWM波形如下:

可以看到输出一个脉冲之后频率改变了一次,而占空比没有发生变化。

推荐阅读

史海拾趣

Garmin_Canada_Inc.公司的发展小趣事
合理的电路设计可以减少信号干扰和失真,提高拨号的准确性。例如,在接收部分采用单端输入,并配置适当的滤波电路和放大电路;在发送部分则注意信号的波形整形和功率放大。
Caddock公司的发展小趣事

为了进一步提升市场竞争力,Caddock公司积极寻求国际合作。通过与全球知名电子企业的合作,公司成功将产品打入国际市场,实现了品牌影响力的扩大和市场份额的提升。同时,公司还积极参加国际电子展会和技术交流活动,不断吸收行业前沿技术,推动自身技术创新和产业升级。

Hitachi Chemical Co America Ltd公司的发展小趣事

Caddock公司的发展可以追溯到1962年,当时公司推出了Micronox电阻系统。这一创新技术使电阻器在极端操作条件和恶劣环境下实现了高水平的稳定性和可靠性。这一重大突破为Caddock公司赢得了市场的广泛认可,并为后续的电阻材料技术发展奠定了坚实的基础。

Atlantic Microwave Ltd公司的发展小趣事

在追求经济效益的同时,Atlantic Microwave Ltd公司始终不忘履行社会责任。公司积极参与公益事业,捐赠资金和技术支持给需要帮助的地区和行业。同时,公司还注重环保和可持续发展,采用环保材料和节能技术,降低生产过程中的能耗和排放,为社会的可持续发展做出了积极贡献。

以上五个故事仅是对Atlantic Microwave Ltd公司可能经历的发展阶段的虚构描述,实际情况可能因各种因素而有所不同。这些故事旨在展示一个电子企业在发展过程中可能面临的挑战和机遇,以及如何通过不断努力和创新实现持续发展。

Corsair Electrical Connectors Inc公司的发展小趣事

在国内市场取得一定成绩后,Corsair开始将目光投向了更广阔的国际市场。公司积极参加国际电子展会,与海外客户建立联系,拓展销售渠道。同时,Corsair还根据不同国家和地区的市场需求,调整产品策略,提供定制化的解决方案。这些努力使得Corsair的产品逐渐走进了国际市场,公司的影响力也不断扩大。

锋鸣电子(Fengming)公司的发展小趣事

福斯特(FIRST)公司在光伏封装材料领域取得了显著成就。自2003年公司前身杭州福斯特热熔胶膜有限公司成立以来,团队成功研发出EVA太阳能电池胶膜,正式进军光伏行业。此后,公司不断投入研发,扩大产能,光伏胶膜(EVA/POE胶膜)的设计产能已达10.51亿平米。至2020年,公司光伏胶膜销量达8.65亿平米,占据全球市场份额约55%-60%,大幅领先其他竞争对手。这一成就不仅巩固了福斯特在光伏胶膜市场的领导地位,还推动了整个行业的发展。

问答坊 | AI 解惑

整理的proteus的教程和视频

今天很多朋友问我,如何应用proteus,今天我整理了相关的教程和一个flash教程, 大家一起学习吧!…

查看全部问答>

ARMSD卡文件系统的实现

ARMSD卡文件系统的实现…

查看全部问答>

中颖全系列单片机机选型表

深圳驰泰代理中颖全系列单片机,附件为选型表,欢迎大家下载。 CHIPTECH SEMICONDUCTOR CO.,LTD 深圳市驰泰电子有限公司 hidy/王芳 QQ:313030919 MSN:wfhidy@hotmail.com Tel:86-755-33340867 Fax:86-755-33340839 Mob:13590192992 E-ma ...…

查看全部问答>

WINCE下如何截取屏幕上某个RECT区域上的图片?急

我现在有480*800的一个窗口 上面有背景图和其他一些图。。都贴在上面。 当我点击任意一点。如何才能把点击后规定的区域下的图片拿出来可以用?…

查看全部问答>

请教高手:micro C/os-ii 移植的问题

请高手帮帮忙: 最近想把「micro C/os-ii The Real-Time Kernel 」书中的 chapter 1 之example 1-4 移植 至 s3c2440 开发板子中,却觉得不容易上手,请高手不吝多多指教,谢谢! …

查看全部问答>

ads和linux交差编译环境的区别

这两个不都是最终都是生成arm的识别的文件,有什么区别吗,生成的格式不一样?这两个环境各生成什么格式文件,如何下载或者说用什么软件下载?有人说ads一般用于裸机编程,是这回事吗? 我是菜鸟,不要喷我,感谢啦…

查看全部问答>

圆点博士微型四轴飞行器电路原理图

圆点博士微型四轴飞行器电路原理图 …

查看全部问答>

正月十五闹花灯!几个简单的LM317频率可调的闪光灯电路图

LM317常用作电压稳压器中的调整元件,这里给大家介绍一个不寻常的应用,只要配上不多的外部元件,可以使一个12V的小灯泡闪烁发光。 如图,采用所给的元件参数值和信号,当电路接通以后,小灯泡将以4Hz的频率闪烁,当然,若改变元件参数(R2或C ...…

查看全部问答>

FLASH历程的疑问

TI给的关于FLASH历程 void main(void) {   unsigned long * Flash_ptrD;               // Initialize Flash pointer Seg D   unsigned long value;   WDTC ...…

查看全部问答>

职场法则故事映射上下级相处法

  每个上司都有自己的个性,但是你知道吗,从某种程度上讲,人们的性格是可以被稍微调整的。就拿处于热恋中的人来说,就算平时最懦弱的男人,也一定会在心爱的女人面前表现出英雄气概。   就算不是恋爱,碰到了一个楚楚可怜的女孩子,很多男 ...…

查看全部问答>