STM8学习笔记---PWM互补波形输出

发布者:rho27最新更新时间:2021-09-22 来源: eefocus关键字:STM8  PWM 手机看文章 扫描二维码
随时随地手机看文章

脉宽调制(PWM,Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。


常见的用法是输出一路PWM波,可以通过调节PWM的频率和占空比来控制电路。还有另一种方法是输出一组互补的PWM波,这两个波形频率相同,相位相反,两组波形之间有死区控制时间。


STM8单片机自带PWM互补波形输出功能,通过资料可以看出 STM8共有3个死区时间可调的互补输出。

本次实验用的STMs8003单片机有2个互补输出。

PC6口和PC3口是定时器1通道1互补输出。PC7口和PC4口是定时器1通道2互补输出。


要配置输出互补PWM波,只需要在输出PWM的基础上,开启互补输出功能就行。

只需要在CCER寄存器中开启CCxNE寄存器,就能开启互补输出功能。


如果需要设置死区时间,还需要配置DTR寄存器。

下来看一下程序中如何配置


void PWM_GPIO_Init( void )

{

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

    PC_CR1 |= ( 1 << 6 );

    

    PC_DDR |= ( 1 << 3 );  //PC3 推挽输出

    PC_CR1 |= ( 1 << 3 );

    

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

    PC_CR1 |= ( 1 << 7 );

    

    PC_DDR |= ( 1 << 4 );  //PC4 推挽输出

    PC_CR1 |= ( 1 << 4 );

}

设置 IO口,将IO口设置为推挽输出。


下来初始化定时器


#define  FRE   320 

//定时器1初始化

void TIM1_Init( void )

{

    PWM_GPIO_Init();

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

    //设置TIM1 CH1 与 TIM1 CH1N通道

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

    //TIM1_CCER1 |= 0x01;                       //CC1为输出 高电平有效

    TIM1_CCER1 |= (1<<0)|(1<<2);              //CC1为输出 OC1高电平有效 开启OC1N OC1N高电平有效 

    

    //设置TIM1 CH2 与 TIM1 CH2N通道

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

    //TIM1_CCER1 |= (1<<4);                   //CC2为输出   关闭互补输出

    TIM1_CCER1 |= (1<<4)|(1<<6);             //CC2为输出   互补输出使能

    

    TIM1_PSCRH = 0x00;                        //预分频 0 

    TIM1_PSCRL = 0x00;                        //16M

    

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

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

  

    //TIM1_BKR |= (1<<7)|(1<<4);                 //刹车寄存器 使能OC1输出 定时器不工作时输出无效电平  开启刹车输入 刹车输入低电平有效

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

    TIM1_DTR = 0x18;                          //死区时间 24*125ns=3000ns

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

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

}

定时器初始化完成后,用一个单独的函数来调节PWM的占空比。


//TIM1 CH1  PC6

void TIM1_CH1_OUT( unsigned int DC )

{

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

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

}

 

//TIM1 CH2  PC7

void TIM1_CH2_OUT( unsigned int DC )

{

    TIM1_CCR2H = DC >> 8;

    TIM1_CCR2L = DC;

}

下来在主函数中调用占空比修改函数,就能设置占空比了。


void main( void )

{

    SysClkInit();

    __asm( "sim" );                       //禁止中断

    TIM1_Init();

    __asm( "rim" );                       //开启中断

 

    delay_ms( 500 );  

    TIM1_CH1_OUT(FRE/3);                  //设置占空比为33%

    TIM1_CH2_OUT(FRE/3);

    

    while( 1 )

    {

       

    }

}

主函数就比较简单了,初始化完定时器,然后设置输出占空比就可以了。


下来还有一个最重要的步骤,需要配置STM8的选项字。因为互补输出不是IO口的默认功能,要使用互补输出还需要将引脚功能手动设置为互补输出。


设置选项字比较简单的方法就是通过STVP软件设置,详细设置方法参见  如何设置STM8单片机选项字  这篇博客。


打开STVP软件,然后添加要烧写的HEX文件。

然后切换到 OPTION BYTE界面

AR7 ---- AR0就是设置IO口默认功能选项。

点一下AFR7后面选项那个倒三角符号

然后在出现的下拉框中选择 Port C3 Alternate Function = TIM1_CH1N,Port C4 Alternate Function = TIM1_CH2N选项。


这个选项的意思就是将PC3设置为定时器1通道1互补输出功能,将PC4设置为定时器1通道2互补输出功能。而默认选项的是将PC3设置为定时器1通道3,将PC4设置为定时器1通道4。


如果不设置选项字,刚才的程序烧写后,单片机的PC3和PC4引脚是没有任何波形输出的。


按照同样的方法设置AFR0选项,将PC6和PC7设置为定时器功能。

设置完成后如下图所示

只需要设置AFR7和AFR0两个选项就行,其他的为默认值。如果互补输出时用到了刹车功能,这里就还要设置一个AFR4选项。本次实验中没有用到刹车功能,所以就不需要设置AFR4。设置完成后烧写程序就行。


输出波形如下所示

可以看到两个波形是互补输出的,但是两个波形占空比相差比较大,这是因为为了方便观察,将死区时间设置的比较大,代码中的死区时间为3us。


在代码中将死区时间设置为250ns

再看下输出波形

死区时间设置比较小的时候,输出的波形,看起来基本对称了。


这时PWM的互补输出功能就成功实现了。

关键字:STM8  PWM 引用地址:STM8学习笔记---PWM互补波形输出

上一篇:STM8学习笔记---ADC多通道采样遇到问题及解决方法
下一篇:STM8学习笔记---NTC热敏电阻的使用

推荐阅读最新更新时间:2024-11-10 23:20

stm8程序占用flash和ram 插件
STVD编译器,编译时候不显示用了多少RAM和ROM?对于此问题,方法:一是看.map文件 另一种是 增加一个补丁,具体操作如下,可以在我的资源里下载相应的文件。 链接: https://pan.baidu.com/s/1BpPNJ5W08M6lsRtiEoX2XA 提取码: 8fqr 步骤 1. 将附件压缩包中的mapinfo.exe解压到stvd的安装路径STMicroelectronicsst_toolsetstvd中; 2. 用stvd打开你的工程文件,在工程上点右键选settings... 3. 右侧的选项卡选择Linker,将category的下拉框选成output,然后在Generate Map file前打
[单片机]
移相控制的全桥PWM变换器的电路及元件详解
移相控制的全桥PWM变换器是最常用的中大功率 DC/DC 变换电路拓扑形式之一。移相PWM控制方式利用开关管的结电容和高频变压器的漏电感或原边串联电感作为谐振元件,使开关管能进行零电压开通和关断,从而有效地降低了电路的开关损耗和开关噪声,减少了器件开关过程中产生的电磁干扰,为变换器提高开关频率、提高效率、减小尺寸及减轻质量提供了良好的条件。然而,传统的移相全桥变换器的输出整流二极管存在反向恢复过程,会引起寄生振荡,二极管上存在很高的尖峰电压,需增加阻容吸收回路进行抑制,文献提出了两种带箝位二极管的拓扑,可以很好地抑制寄生振荡。本文采取文献提出的拓扑结构,设计了一台280 W移相全桥软开关DC/DC变换器,该变换器输入电压为19
[电源管理]
移相控制的全桥<font color='red'>PWM</font>变换器的电路及元件详解
MSP430FR6989系列教程之PWM
一、PWM波 单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号,在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压,PWM就是通过这种原理实现D/A转换的。 可以看到当采用不同的输出模式时,会得到不同的脉冲波形,我们通过更改预分频值和自动重装载值就可以得到不同周期的脉冲信号,通过改变输出比较的阈值就可以实现对占空比的调节。 所以,很显然,在我们明白了这一点后,我们就可以在此基础上完成用PWM波实现led呼吸灯的现象。 二、代码编写 思路整理 初始化系统时钟 初始化IO口 配置定时器
[单片机]
MSP430FR6989系列教程之<font color='red'>PWM</font>波
Allegro发布全新四路DMOS全桥PWM电机驱动器IC
新产品具有自适应百分比快速衰减(APFD)功能,可以降低电流纹波,提高微步进准确度,减小可闻噪音 Allegro MicroSystems,LLC发布一款全新的四路DMOS全桥驱动器IC A5990,它可驱动两个步进电机或四个直流电机,每个全桥的额定输出高达1.6A和40V。Allegro的A5990集成有固定的关断时间脉宽调制(PWM)电流稳压器和2位非线性数模转换器(DAC),从而能够以整步进、半步进和四分之一步进行步进电机的控制,或者以向前、反转和滑行模式控制直流电机。对于每个全桥,可以通过独立的电流控制参考电压输入实现高分辨率微步进控制。A5990 PWM电流稳压器具有外部可调节的关断时间,可根据电源电压和电机参数调整电流
[电源管理]
IAR调试stm8的优化设置
本来想使用iar的debug功能,通过st-link调试stm8板子,查看一下变量的值,结果死活看不到结果有变化,一直显示不可用,当时我就纳闷了,这他娘的是咋回事? 没办法,上网搜吧,于是发现,原来是跟编译的优化级别有关系,默认的优化级别是low,把它改成None,然后单步就能看到变量的值了。 调整完优先级就可以看到变量的值了。
[单片机]
STM32F107的通用定时器PWM实验总结
1. STM32F107的通用定时器是指: TIM2、TIM3、TIM4、TIM5、 2. STM32F107的通用定时器(TIM2、TIM3、TIM4、TIM5)的模式有向上计数、向下计数、中央对齐模式。 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
[单片机]
STM32定时器输出带有死区时间的PWM波形
要求得到下列波形,死区时间为1us,CH1,CH2,CH3之间的相位差为3us,频率为50KHz main.c /********************************************* 标题:定时器输出带有死区时间的PWM波形 软件平台:MDK-ARM Standard Version4.70 硬件平台:stm32f4-discovery 主频:168M Periph_Driver_version: V1.0.0 描述:用一个定时器(TIM1),输出带有死区时间的PWM波形,要求:死区时间为1us,CH1,CH2,CH3之间的相位差为3us,频率为50KHz 代码参考
[单片机]
STM32定时器<font color='red'>输出</font>带有死区时间的<font color='red'>PWM</font><font color='red'>波形</font>
MAX8686电流模式同步整流PWM降压调节器
       MAX8686电流模式同步整流PWM降压调节器内置MOSFET,工作电压范围:4.5V至20V,可产生0.7V至5.5V可调输出电压,每相可提供高达25A的电流。   MAX8686采用峰值电流检测模式,开关频率调节范围为300kHz至1MHz。可调限流门限允许针对具体应用的负载电流进行优化。可通过外部检流电阻限制电感电流或利用电感进行无损电流检测。折返式限流和打嗝式限流可降低过载或短路情况下的功耗,故障排除后可自动恢复工作。   MAX8686即使在输出存在预偏置电压时也能够实现单调启动。此外,还提供可调节的软启动,实现受控开启过程。MAX8686内置精度为1%的基准,所提供基准输入用于支持更高精度的外部基准,实现电
[电源管理]
MAX8686电流模式同步整流<font color='red'>PWM</font>降压调节器
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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