在使用STM8单片机的PWM功能时,一直没出现过问题。但是在一个项目中需要在PWM波输出的过程中变频,这时候问题来了。在PWM输出过程中,输出的波形是不是的就会有一大段空白的地方,好像波形输出被关闭了一样。
输出波形如下图所示:
放大后查看
可以看到波形输出的过程中突然就消失了,而且还不是偶尔的出现一次。是频繁的出现。这就奇怪了?难道是单片机坏了?换了几个单片机测试都是这样的,那么肯定就是软件代码出问题了。那么到底是什么地方有问题了,于是开启找BUG模式,一行一行代码分析。
代码分析了半天也没找不到哪行代码有问题,输出单一频率的PWM波一直很稳定,只是改变频率的时候就会出现波形断开情况,频率改变的越多,出现断开的这种情况就会越多,那么肯定就是在变频设置的这块有问题,网上找了半天也没找见有用的方法,看来还是得靠自己解决问题。
于是开始看芯片手册,关于定时器相关的章节,一个字一个字往过分析。终于发现了一点端倪。
在定时器时基单元介绍的时候提到了一个自动预装载的功能,并且还有一个影子寄存器。当我们设置寄存器的装载值时,其实不是直接设置的寄存器,而是值传递给通过ARR寄存器传递给影子寄存器,然后由影子寄存器去设置定时器的装载值。
继续往下看,会讲到影子寄存器的作用。
在向上计数模式中说到了使能和不使能ARPE的区别,从图上大概可以看出来,不使能预装载功能时,自动重装载寄存器和它的影子寄存器是同步的,相当于计数器溢出时,影子寄存器会被立即跟新。而使能了预装载功能后,计数器溢出时,影子寄存器不会立即更新,而是要等一段时间更新。
这里说的是向上计数模式,而代码中使用的是PWM模式,下面继续看PWM模式介绍中有没有说这个预装载功能。
在PWM模式中也提到了预装载寄存器,同时也说了要使能TIM1_CR1寄存器的ARPE位,那么是不是这个预装载寄存器没有开启导致的?
于是在定时器初始化代码中开启预装载寄存器。
开启TIM1_CR1寄存器中的APRE位,允许自动预装载寄存器。开启TIM1_CCMR1寄存器中OC1PE位,使能TIM1_CCR1寄存器的预装载功能。
设置好之后继续测试测试
这时发现输出的波形竟然好了,中间没有断开的地方了。看来就是这个预装载寄存器导致的。
现在仔细分析一下这个预装载功能,为什么在最开始没有开启这个功能呢?可能是被资料上的一句话误导了。
当禁止预装载功能时,写入的数据会立即起作用。想的是如果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 ADC转换模式-------连续扫描模式
推荐阅读
史海拾趣
多年来,昆泰始终秉持着创新的理念,不断推动其在CRO领域的技术突破和业务创新。通过与全球各地的药企、科研机构合作,昆泰在药物研发、临床试验等领域取得了多项重要成果。展望未来,昆泰将继续坚持创新驱动的发展战略,为全球医药行业的发展做出更大的贡献。
随着公司技术的不断成熟和产品的不断优化,EMS GmbH公司开始积极拓展市场。公司不仅在欧洲市场取得了显著的成绩,还逐渐将业务拓展至全球范围。通过参加国际展会、与合作伙伴建立战略合作关系等方式,EMS GmbH公司不断提升品牌知名度和影响力。同时,公司还注重产品质量和服务质量的提升,以确保在激烈的市场竞争中保持竞争优势。
随着技术的不断成熟,Diode Laser Concepts公司开始将产品推向市场。公司凭借其卓越的性能和稳定性,在电子制造、半导体加工等领域迅速获得了客户的认可。同时,公司不断投入研发,推出了一系列创新的二极管激光产品,如超短脉冲激光器和高精度定位系统等,进一步巩固了市场地位。
AAC公司的创立可以追溯到上世纪90年代初,当时电子音响器件市场正迎来快速发展的机遇。AAC公司敏锐地捕捉到了这一市场趋势,迅速行动,与德国投资者共同成立了中德合资常州威利来电子音响器件有限公司。这一合资举措为AAC带来了先进的生产技术和管理经验,使其生产的讯响器和微型扬声器迅速打开了德国市场的大门。这一成功的合资经验为AAC后续的发展奠定了坚实的基础。
在光伏产业快速发展的背景下,GPS于2020年进军光伏逆变器市场。公司凭借其深厚的技术积累和创新能力,开发出了一系列高效、可靠的光伏逆变器产品。这些产品不仅转换效率高,而且具备智能监控和远程控制功能,大大提升了光伏电站的运行效率和安全性。GPS的光伏逆变器产品迅速获得市场认可,成为众多光伏项目的首选设备。
随着全球对环境保护和社会责任的日益关注,Carlo Gavazzi公司也积极承担起自己的社会责任。公司致力于开发环保型产品和技术,推动可持续发展。同时,公司还积极参与社会公益活动,回馈社会,赢得了广泛的社会认可和尊重。
这五个故事只是Carlo Gavazzi公司发展历史中的一部分,但它们足以展示这家公司在电子行业中的奋斗、创新和成功。作为一家具有悠久历史和深厚底蕴的企业,Carlo Gavazzi公司将继续在未来的发展中书写新的篇章。
本帖最后由 paulhyde 于 2014-9-15 09:34 编辑 本人英语基础较差,急需电子类英文翻译文章,做毕业设计使用。希望的到诸位帮助,在次先表示感谢啦!!!我的邮箱:liqz2004001@sina.comQQ:258364809 … 查看全部问答∨ |
目前CPU主频为72M,Fpclk=36M #define BITRATE10K72MHZ 0x0015018F #define BITRATE100K72MHZ&n ...… 查看全部问答∨ |
现在想在EMMC卡(焊在PCB上的存储卡)或是T卡设置两个目录或是分区 1个连接PC的时候,在PC上可见; 另1个连接PC的时候,在PC上不可见; 但是两个目录或是分区在手机端都是可见得。 隐藏的目录或是分区,主要用来保护里面的文件不被拷贝到PC或是 ...… 查看全部问答∨ |
在网上下载(verycd上拖的)的tornado的安装镜像ISO文件,分别有CD1和CD2两个,请问CD1和CD2分别是干什么用的?似乎是CD1安装完成之后就是tornado编程环境,那么CD2里面又是什么东东啊?我在安装完CD1之后又安装了CD2,安装目录均在同一目录下,c:\ ...… 查看全部问答∨ |
CC2530+RFX2401C测试不通信,不能入网,但是不加PA却可以入网,PA的设定都是按照TI给的方式定义的,还是不通信,TXEN(P1_2),RXEN(P2_0),宏定义 HAL_PA_LNA; RFC_OBS_CTRL0 = RFC_OBS_CTRL_PA_PD_INV; OBSSEL2&nb ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 如今的手机摄像头为什么越来越多?
- iPhone 12 Pro Max拆解照解密:主板袖珍、L型电池仅3687mAh
- 中科新源股权投资签约仪式暨公司成立三周年圆满成功了
- 总投300亿元,康佳第三代化合物半导体项目落地
- 中芯国际:14nm工艺去年Q4量产,良率已达业界量产水准
- MIX 4之后小米MIX FOLD迭代机型:补齐高刷屏 配屏下前摄
- AGM G1系列发布:3699元零下30度可用 有热成像技术、夜视功能
- 中国智能手机Q3出货量同比降9%:vivo排第一 荣耀增速快
- App Store关键词集体落榜现象已恢复,波及范围甚广!
- Redmi Note 11 Pro+解密:双十一档的120W快充小金刚