STM32F103输出互补PWM波

发布者:蓝天飞行最新更新时间:2022-01-06 来源: eefocus关键字:STM32F103  输出  互补PWM波 手机看文章 扫描二维码
随时随地手机看文章

STM32F103单片机定时器自带互补PWM波形输出功能,利用定时器输出比较模式,不仅可以输出互补的 PWM波,还可以设置输出方波的起始相位和死区时间。


下面就总结一下如何实现PWM互补输出。


void TIM1_PWM_DeadtimeInit( u16 arr, u16 psc, u16 ccr1, u16 ccr2, u16 deadtime )

{

    GPIO_InitTypeDef GPIO_InitSturcture;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

 

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );

 

    //TIM1 互补PWM CH1->PA8  CH2->PA9  CH1N->PB13  CH2N->PB14

    GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;

    GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init( GPIOA, &GPIO_InitSturcture );

 

    GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;

    GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init( GPIOB, &GPIO_InitSturcture );

    //定时器设置

    TIM_TimeBaseInitStructure.TIM_Period = arr;

    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x00;

    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;

    TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure );

    //通道1 捕获比较模式设置

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //翻转,当 TIMx_CCR1=TIMx_CNT时,翻转OC1REF的电平

    TIM_OCInitStructure.TIM_Pulse = ccr1; //100

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //CCER的CC1P,输入/捕获输出极性

    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //CER的CC1N,输入/捕获输出使能

    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //OIS1位

    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;  //CR2的OIS1N位,当MOE位0时,输出空闲状态位OIS1N.

    TIM_OC1Init( TIM1, &TIM_OCInitStructure );

    //通道2 设置

    TIM_OCInitStructure.TIM_Pulse = ccr2; //316

    TIM_OC2Init( TIM1, &TIM_OCInitStructure );

    //刹车和死区设置

    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; //OSSR:运行模式下“关闭状态”选择

    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; //OSSI:空闲模式下“关闭状态”选择

    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; //锁定设 置,级别为1

    TIM_BDTRInitStructure.TIM_DeadTime = deadtime; //死区延时时间

    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //禁止刹车输 入

    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; //刹车输入极性

    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; //自动输出使能

    TIM_BDTRConfig( TIM1, &TIM_BDTRInitStructure );

 

    TIM_CtrlPWMOutputs( TIM1, ENABLE );

    TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Enable );

    TIM_OC2PreloadConfig( TIM1, TIM_OCPreload_Enable );

    TIM_ARRPreloadConfig( TIM1, ENABLE );

    TIM_Cmd( TIM1, ENABLE );

}


首先初始化IO口,这里使用的是定时器1的通道1和通道2。

PA8为定时器1通道1输出口,PB13为定时器1通道1互补输出口。


PA9为定时器1通道2输出口, PB14为定时器1通道2互补输出口。


下来初始化定时器,参数arr设置输出PWM波频率,psc设置定时器时钟分频系数。定时器初始化之后,设置定时器工作模式为输出比较模式,其中参数 ccr1 设置通道1的输出方波起始相位,参数cc2设置通道2输出方波起始相位。参数 deadtime 设置互补PWM波形的死区时间。初始化结束后启动定时器。


关于输出比较模式的详细说明参考STM32输出比较模式和PWM模式 比较这篇文章。


下面看主函数设置


#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#include "pwm_ch_chn.h"

// LED0  PA8  LED1 PD2

int main(void)

{

    delay_init();       //延时函数初始化

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    LED_Init();

    LED0 = 1;

    LED1 = 1;

    delay_ms(500);

    LED0 = 0;

    LED1 = 0;

    // Tout=(719+1)*(0+1)/72M=10us   72M/720=0.1M=100K

    TIM1_PWM_DeadtimeInit(719,0,0,0,72);//50KHz

    while(1)

    {

    }

}

 

主函数中设置自动装载值为 720,分频系数为0,那么输出方波频率为 72MHz / 720 = 0.1MHz,也就是输出波形频率为100K,由于此处用的是定时器的输出比较模式,所以输出频率为计算值的一半,所以实际输出方波频率为50KHz。ccr1值设置为0,也就是定时器1通道1的输出波形起始相位为0,ccr2的值为0,所以起始相位也为0。死区时间设置为72,为周期数的1/10,也就是2us。


下面看一下输出波形

黄色为 TIM1_CH1波形,绿色为TIM1_CH1N波形,这两个波形是通道1互补波形。


蓝色为 TIM1_CH2波形,粉色为TIM1_CH2N波形,这两个波形是通道2互补波形。


黄色和蓝色波形起始相位相同。

原波形和互补波形死区时间为1us,刚才计算的死区时间是2us,这里为什么是1us?因为死区时间是上升沿时间差+下降沿时间差,是两个对称的区间。这里只测了一个区间,所以为总时间的一半。


下来同时改变ccr1和ccr2的初始值,看看输出波形相位有没有发生变化。


TIM1_PWM_DeadtimeInit(719,0,72,144,72);//50KHz


输出波形为

蓝色波形下降沿比黄色波形下降沿滞后了一点,说明起始相位已经发生了改变。

放大波形后可以看到,下降沿滞后的时间为1us,和死区时间相同。

关键字:STM32F103  输出  互补PWM波 引用地址:STM32F103输出互补PWM波

上一篇:STM32不同型号单片机keil工程移植说明
下一篇:STM32输出比较模式和PWM模式 比较

推荐阅读最新更新时间:2024-11-13 15:32

两节7.4V锂电池让蓝牙音箱输出相当铅酸电池12V供电的功率?
铅酸电池一直以来是户外移动中大功率音响的主要供电方式。铅酸电池电压高,输出电流大,直供音频功放可输出2×20W功率。但铅酸电池供电也有其弊端:体积大、不环保、循环充电次数不高。随着锂电池的技术进步,重量轻体积小、循环充电次数高、绿色环保等优势得以广泛应用。针对户外蓝牙音响便携移动的特性,基于体积重量、使用寿命、环保等因素考虑,双节串联7.4V锂电池是未来一个时期的户外蓝牙音箱理想供电电源(3节锂电因为电池之间的差异要考虑平衡、充电成本等限制其应用普及)。但是两节18650锂电串联的电压是6V-8.4V,在电池直供的情况每个声道只能提供7W/4欧的功率输出,音量偏小。 深圳市永阜康科技有限公司总结市场应用痛点,现在大力推广一
[物联网]
两节7.4V锂电池让蓝牙音箱<font color='red'>输出</font>相当铅酸电池12V供电的功率?
STM32F103RCT6的普通IO口模拟串口的实验
使用了STM32CubeMX及Keil (HAL库) 材料:stm32开发板、USB转TTL?CH340模块、杜邦线、st-link 实验原理: 模拟了异步半双工通信 波特率可变 起始位:1 数据位:8 停止位:1 (1个数据10位) 无校验位 传输一个字符的时候先发送1位起始位,然后是8位数据位(从低位到高位),最后是一位停止位 用1个普通的GPIO口输出(模拟TXD),模拟了以上发送的高低电平,采用定时器延时(一个位对应的电平的持续时间为1000000/波特率 μs) 用1个普通的GPIO口中断输入(模拟RXD),模拟了接收,下降沿触发中断,采用定时器延时,大概在数据位中央采集1次电平数据 实验设计: 使用了PA1作
[单片机]
STM32F407 基本定时器配置输出PWM方波
介绍STM32F407定时器PWM波形输出配置方式。 通过逻辑分析采集波形数据进行可视化显示对比。 【1】定时器PWM功能介绍 STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达4路的PWM输出! 【2】PWM波形输出通道介绍 ** 定时器3的硬件PWM通道:PA6 PA7 PB0 PB1** 下面截图是介绍定时器3通道的复用IO口模式配置方式 【3】配置PWM波形输出代码示例 在工程中增加pwm.c文件,写入以下代码 #include pwm.h
[单片机]
STM32F407 基本定时器配置<font color='red'>输出</font><font color='red'>PWM</font>方波
stm32f103 USART串口简单实现
(基于奋斗stm32_v5开发板) 1、创建工程并编写C程序 #include stm32f10x.h #include stdarg.h void USART1_Config() { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* 使能USART1的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE); /*配置USART1 TX,并设置为复用推挽输出模式*/ GPIO_In
[单片机]
<font color='red'>stm32f103</font> USART串口简单实现
STM32F103c8t6通过串口实现IAP在线升级固件
STM32f103c8t6 IAP在线升级 设计思路:(自己理解的哈,如果有问题,欢迎大家提出来,一起学习哈) 首先程序每次执行都会从基地址0x0800 0000开始执行。IAP程序升级最重要的就是写BOOTLOADER程序,进行引导升级,加载,跳转app程序。每次上电后进入bootloader判断是否升级如果需要升级,就就收bin文件进行升级,如果不升级直接跳入原app程序执行。 bootloader和app程序的FLASH大小根据实际情况自己确定分配就可以了 下面是我自己画得一个流程图:主要介绍整个大的流程 bin文件的生成方法可以百度一下,网上很多的 代码:(我是根据正点原子的例程改的,代码只贴了重要部分,如果有需要
[单片机]
<font color='red'>STM32F103</font>c8t6通过串口实现IAP在线升级固件
STM32 IO口输入输出模式的简洁见解
输入模式 (1)浮空输入:没有外界电压输入时,电压不确定。 (2)上拉输入:没有外界电压输入时,IO口经过一个上拉电阻接高电压Vcc,再经过施密特触发器转换成1信号,此时为高电平。(无输入,高电平) 有外界电压输入时,电压进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平是高电平还是低电平。 (3)下拉输入:没有外界电压输入时,IO口经过一个上拉电阻接低电压Vss,再经过施密特触发器转换成0信号,此时为低电平。(无输入,低电平) 有外界电压输入时,电压进入芯片后加了一个下拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平是高电平还是低电平。 (4)模拟输入:
[单片机]
STM32F103单片机学习笔记(1):用库新建工程和驱动IO口
一、用库新建工程 1、打开软件新建工程,project- new project 2、在工程中分别新建文件夹: Libraries用来装库函数,把库函数的包复制到这个的文件夹中; User用来装主函数和与注册中断的函数,main.c和system_stm32f10x.c放在这里面; Startup用来装启动文件,startup_stm32f10x_hd.s放在里面; CMSIS用来装系统文件,core_cm3.c放在里面; 3、点击,在工程下分别按照如下添加组和文件 4、点击 选择C/C++,添加头文件目录,我都把他们添加进来 5、接着再选择linker Debug设置下载方式 这里要注意一下,单片机在每次下载程
[单片机]
<font color='red'>STM32F103</font>单片机学习笔记(1):用库新建工程和驱动IO口
STM32F103学习记录-----GPIO篇
GPIO端口配置 32bit配置寄存器 GPIOx_CRL GPIOx_CRH 32bit数据寄存器 GPIOx_IDR GPIOx_ODR 32bit置位/复位寄存器 GPIOx_BSRR 16bit复位寄存器 GPIOx_BRR 32bit锁定寄存器 GPIOx_LCKR GPIO可以被配置成多种模式 输入方式 代码宏定义 浮空输入 GPIO_Mode_IN_FLOATING 上拉输入 GPIO_Mode_IPU 下拉输入 GPIO_Mode_IPD 模拟输入 GPIO_Mode_AIN 开漏输出 GPIO_Mode_Out_OD 推挽输出 GPIO_Mode_Out_PP
[单片机]
<font color='red'>STM32F103</font>学习记录-----GPIO篇
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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