历史上的今天

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

2021年09月17日 | STM8输出PWM变频时波形断开解决方法

发布者:CuriousObserver 来源: eefocus关键字:STM8  输出PWM  变频 手机看文章 扫描二维码
随时随地手机看文章

  在使用STM8单片机的PWM功能时,一直没出现过问题。但是在一个项目中需要在PWM波输出的过程中变频,这时候问题来了。在PWM输出过程中,输出的波形是不是的就会有一大段空白的地方,好像波形输出被关闭了一样。

输出波形如下图所示:

53c1609fefb95c85926520aa3ff4acc.jpg

  放大后查看

50bc90ec5a41ea39ae96d5d0814b177.jpg

  可以看到波形输出的过程中突然就消失了,而且还不是偶尔的出现一次。是频繁的出现。这就奇怪了?难道是单片机坏了?换了几个单片机测试都是这样的,那么肯定就是软件代码出问题了。那么到底是什么地方有问题了,于是开启找BUG模式,一行一行代码分析。


  代码分析了半天也没找不到哪行代码有问题,输出单一频率的PWM波一直很稳定,只是改变频率的时候就会出现波形断开情况,频率改变的越多,出现断开的这种情况就会越多,那么肯定就是在变频设置的这块有问题,网上找了半天也没找见有用的方法,看来还是得靠自己解决问题。


  于是开始看芯片手册,关于定时器相关的章节,一个字一个字往过分析。终于发现了一点端倪。

image.png

image.png

  在定时器时基单元介绍的时候提到了一个自动预装载的功能,并且还有一个影子寄存器。当我们设置寄存器的装载值时,其实不是直接设置的寄存器,而是值传递给通过ARR寄存器传递给影子寄存器,然后由影子寄存器去设置定时器的装载值。


  继续往下看,会讲到影子寄存器的作用。

image.png

image.png

image.png

image.png

  在向上计数模式中说到了使能和不使能ARPE的区别,从图上大概可以看出来,不使能预装载功能时,自动重装载寄存器和它的影子寄存器是同步的,相当于计数器溢出时,影子寄存器会被立即跟新。而使能了预装载功能后,计数器溢出时,影子寄存器不会立即更新,而是要等一段时间更新。


  这里说的是向上计数模式,而代码中使用的是PWM模式,下面继续看PWM模式介绍中有没有说这个预装载功能。

image.png

image.png

image.png

  在PWM模式中也提到了预装载寄存器,同时也说了要使能TIM1_CR1寄存器的ARPE位,那么是不是这个预装载寄存器没有开启导致的?


  于是在定时器初始化代码中开启预装载寄存器。

image.png

image.png

   开启TIM1_CR1寄存器中的APRE位,允许自动预装载寄存器。开启TIM1_CCMR1寄存器中OC1PE位,使能TIM1_CCR1寄存器的预装载功能。


   设置好之后继续测试测试

dee2ac2796e0f69bb500e81e7fcd28d.jpg

   这时发现输出的波形竟然好了,中间没有断开的地方了。看来就是这个预装载寄存器导致的。


  现在仔细分析一下这个预装载功能,为什么在最开始没有开启这个功能呢?可能是被资料上的一句话误导了。

image.png

  当禁止预装载功能时,写入的数据会立即起作用。想的是如果PWM要变频,肯定是数据要随时变化,需要改变频率后,立即输出就要发生改变。所以禁止了预装载功能。


  通过上面的资料分析和实验现象来看,对于这句话的理解可能出现了问题。立即生效也就是意味着发出PWM波的过程中,如果一个周期的波没有完全发出去,此时如果改变了频率,那么发送的上一个周期的波就会立即停止,重新开始发送新的周期波。这样的话,发出的波形就会出现不完整,如果代码中改变频率的速度非常快,那么有可能第一个周期的波还没有发出,频率改变了,又开始发第二个波,第二个波还没发出,频率又改变了。于是导致输出的波形有问题。


  而希望输出的波形是,每一个频率至少要输出一个完整的波形,然后在下一个周期再改变频率。所以这里必须要使能预装载寄存器,使能预装载寄存器后,设置的值不会立即生效,而是存入影子寄存器中,影子寄存器会在寄存器重新加载ARR值的时候,将改变后的值写入ARR寄存器,这样在波形输出的过程中,就不会发生一个周期的波形未输出完成时,ARR的值就被改变了。


  由此可见,这个预装载寄存器和影子寄存器主要是用来保证输出波形完整性的,它会自动的在一个波形输出完成后才设置下一次需要改变的值,而不会中断正在输出的波形。所以在使用PWM变频时,必须要开机预装载寄存器和自动重装载功能。


完整的PWM变频代码如下:


#include "pwm.h"


unsigned int tim1fre  = 290;            

unsigned int ch1_dc = 50;

unsigned int ch2_dc = 50;


void pwm_gpio_init( void )

{

    PC_DDR |= ( 1 << 6 );               //PC6 推挽输出

    PC_CR1 |= ( 1 << 6 );

 

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

    PC_CR1 |= ( 1 << 7 );

    

    PC_ODR &= ~( 1 << 6 );

    PC_ODR |= ( 1 << 7 );

}

//定时器1初始化

void tim1_init( void )

{

    pwm_gpio_init();


    TIM1_CCMR1 = 0x60;                  //TIM1 CH1 输出模式 PWM1

    TIM1_CCMR1 |= ( 1 << 3 );           //开启预装载功能

    TIM1_CCER1 |= 0x01;                 //CC1为输出


    TIM1_CCMR2 = 0x60;                  //TIM1 CH2 输出模式 PWM1

    TIM1_CCER1 |= 0x10;                 //CC2为输出


    TIM1_PSCRH = 0x00;                  //预分频 0

    TIM1_PSCRL = 0x00;                  //16M


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

    TIM1_ARRL = ( unsigned char )tim1fre;   //设置自动重装载值低8位


    TIM1_BKR |= ( 1 << 7 );                 //主输出使能  关闭刹车输

    TIM1_CR1 |= ( 1 << 7 );                 //使能预装载寄存器

    TIM1_CR1 |= ( 1 << 0 );                 //使能计数器

}

//TIM1 CH1  PC6

void tim1_ch1_dc( unsigned int ch1_dc )

{

    static unsigned int dc = 0;

    dc = tim1fre * ch1_dc / 100;

    TIM1_CCR1H = dc >> 8;               //捕获比较寄存器高8位

    TIM1_CCR1L = dc;                    //捕获比较寄存器低8位 占空比值

}

//TIM1 CH2  PC7

void tim1_ch2_dc( unsigned int ch2_dc )

{

    static unsigned int dc = 0;

    dc = tim1fre * ch2_dc / 100;

    TIM1_CCR2H = dc >> 8;

    TIM1_CCR2L = dc;

}


void tim1_fre( unsigned int freq )

{

    tim1fre = freq;

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

    TIM1_ARRL = freq;

}

关键字:STM8  输出PWM  变频 引用地址:STM8输出PWM变频时波形断开解决方法

上一篇:STM8单片机 PWM无波形输出解决方法
下一篇:STM8 ADC转换模式-------连续扫描模式

推荐阅读

PwC发布了新报告“AI和机器人将定义新医疗卫生”。我们正在进入医疗卫生的新时代。健康问题对我们每个人来说,无论是作为个人和整个社会都很重要。它是经济、政治、社会和环境繁荣的核心。另一方面,医疗保健也是世界上最大的行业之一。现代卫生系统可以治疗比以往更多的疾病,新技术正在为旧疗法带来创新。但是,重要的质量、访问和成本问题仍然存在,我...
受汽车销量放缓、贸易环境动荡以及联邦政府对工会腐败问题调查日益扩大的影响,今年美国汽车工人联合会(UAW)与多家汽车制造商的谈判之路也忽明忽暗。据外媒报道,日前,通用汽车公司和美国汽车工人联合会(UAW)双方未能就薪水、医疗福利、临时工、就业保障等问题达成初步协议,谈判陷入僵局。当地时间9月16日凌晨,UAW组织了通用汽车约4.8万名员工罢工...
就在前不久,北京现代发布了全新的第七代伊兰特。这代伊兰特主打数字新生代,那么相对于第六代产品,这第七代又搭载了哪些新技术,其核心原理和使用场景又是哪些呢?希望这篇简析看完之后,各位读者能够对第七代伊兰特所搭载的技术能够有一个简单的认识。结语:  随着充满锋芒的新生代人群逐渐成为消费主力军,消费者对A级市场的需求趋于年轻化、经济化...
除了电动化、自动化、智能化,芯片短缺亦是今年慕尼黑国际车展热议的话题之一。从宝马、戴姆勒等整车制造商,到博世、采埃孚等主要零部件供应商,都表示“缺芯”之痛已在德国汽车业蔓延开来。  新冠肺炎疫情暴发前,德国汽车业年收入超过4000亿欧元,直接吸纳就业逾83万人,是德国最大的工业部门,也被德国政府视作最重要的制造业板块。疫情以来的汽车业...

史海拾趣

问答坊 | AI 解惑

Multisim8 使用手册

Multisim8 使用手册…

查看全部问答∨

晒工资了:电工薪水大调查

晒工资了,不记名投票。把你所有的收入都算上,奖金,工资,加班费,兼职,分红双薪,凡是到手的,统统都算上就投一个吧,总有一款适合你,让大家都了解下目前电子行业的行情。注意:是年薪哦,把月工资乘12,再加项目奖等等。…

查看全部问答∨

如何用AT指令来判断移动的SIM卡是否开通GPRS业务?

目前用 AT+CGACT 指令来判断,但有时候判断不准。…

查看全部问答∨

贴片芯片如何焊接,望请教

本人用DA7505元件,8引脚表面贴片封装的,引脚间距仅有1mm,手工焊接有难度。 这种芯片该如何还接较好呢,望指教。 多谢!!…

查看全部问答∨

Download新内核后按键和触摸屏都无声

重新下载新的内核后,按键和触摸屏都变的没有声音了,用PB5.0下的Remote Registry Editor对比两内核的注册表, [HKEY_CURRENT_USER\\ControlPanel\\Volume] [HKEY_LOCAL_MACHINE\\Snd\\Scheme] [HKEY_LOCAL_MACHINE\\Snd\\Event]三者的设置完全一 ...…

查看全部问答∨

Wince下资源出售

X86架构BSP(AMD、VIA芯片组等) S3C2410BSP、原理图、PCB等 …

查看全部问答∨

侃侃我的成果

本人长期从事单片机开发应用,积累了一定的经验。本人将毕生研究心得集成了文字,放在我的博客里,希望大家光临指导,并给点意见。我的博客地址;http://blog.mcuol.com/user/Article/500.html…

查看全部问答∨

FPGA的时钟脚分配以及时钟网络的疑惑

在调Cyclone V的ddr3硬核的时候,里面给ddr3的本地时钟管脚分配时必须要和别的硬核功能管脚在同一个bank,否则编译不通过。 但是我采用的FPGA时钟信号在另一个bank。后来发现在管脚分配(pin planner)里面,和硬核功能管脚在同一个bank里面是有一些 ...…

查看全部问答∨

程序中的,位变量居然赋值是字节,好奇怪,能解释一下吗

sbit MOSIO = P3^4;MOSIO =0xff >> 7        我很奇怪,MOSIO是一个位变量,但是BT3右移7位,本身是一字节,怎么可以把BT3移位后赋值给MOSIO    …

查看全部问答∨

MC34063 DC/DC转换控制电路测试方法

        DC/DC转换器广泛应用于远程及数据通信、计算机、办公自动化设备、工业仪器仪表、军事、航天等领域,涉及到国民经济的各行各业。文章以其中有一定代表性的MC34063电路为例,扼要介绍其电特性和用其构成的升压 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved