历史上的今天
返回首页

历史上的今天

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

正在发生

2019年09月27日 | STM32——TIM死区互补PWM波输出

2019-09-27 来源:eefocus

于pwm波的输出实验老早之前就学了,一直拖到现在才写,,,。由于之前接触过32的高级定时器所以是先从死区pwm波开始学的,后面才学的pwm波。其实会发出死区pwm波了也就会发pwm波了。在学习32的某个功能时要先去看32的数据参考手册了解它的功能然后看它有哪些寄存器,对你需要用到的寄存器深入了解,最后看库函数进行编程。

要发出死区pwm波就要用到32的高级定时器TIM1或TIM8,这两个定时器才有死区寄存器才能发出死区pwm波,对于它们的介绍网上资料有很多这里就不重复啰嗦了,但需要看几个重要的寄存器:

● 控制寄存器(TIMx_CRx)

● 模式控制寄存器(TIMx_SMCR)

● 状态寄存器(TIMx_SR)

● 计数器寄存器(TIMx_CNT)

● 预分频器寄存器(TIMx_PSC)

● 自动装载寄存器(TIMx_ARR)

● 重复次数寄存器(TIMx_RCR)

● 刹车和死区寄存器(TIMx_BDTR)

前面几个寄存器是在配置TIM1/TIM8是要用到的基本设置。自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在TIMx_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件UEV时传送到影子寄存器。当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于0时,产生更新事件。更新事件也可以由软件产生。计数器由预分频器的时钟输出CK_CNT驱动,仅当设置了计数器TIMx_CR1寄存器中的计数器使能位(CEN)时,CK_CNT才有效。(更多有关使能计数器的细节,请参见控制器的从模式描述)。注意,在设置了TIMx_CR寄存器的CEN位的一个时钟周期后,计数器开始计数。最后来看一下死区寄存器:它是用来设置两个互补pwm波的死区时间的

在这里插入图片描述
在这里插入图片描述

上面的位都是在配置死区寄存器要用到的基本配置,下面是它的死区时间配置位[7:0]

在这里插入图片描述

DT表示的是死区时间,分了有四种情况位[7:5]为0xx、10x、110、111(x表示0或1)。32的主频是72M,它每走一下的时间为1/72000000=13.89ns。表中64的由来是2^6,由此32是2的5次方。因为UTG是有8个位。

知道这些应该差不多了,接着就去看它的库函数吧,32定时器的库函数有两页之多,需仔细的看,死区寄存器的配置要注意两路波的极性,不能搞错了。



#include "pwm.h"

#include "sys.h"

//FUNCTION:TIM1初始化函数

//AUTHOR:BiggerPast

//DATE:20181010

void TIM1_Init(u16 arr,u16 psc,u16 dead_time)

{

float T_TDS=13.89;//13.89ns

u16 death_time;                                                                                         

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_BDTRInitTypeDef TIM_BDTRInitStructure;         //死区设置 

//dead_time--->255,以下计算按死区寄存器UTG位而得

if(dead_time >=0 && dead_time <=1764)//公式1

death_time = dead_time/T_TDS;

else if(dead_time>=1778 && dead_time<=3529)//公式2

death_time=dead_time/(T_TDS*2)+64;

else if(dead_time>=3556 && dead_time<=7001)//公式3

death_time=dead_time/(T_TDS*8)+160;

else if(dead_time>=7112 && dead_time<=14001)//公式4

    death_time=dead_time/(T_TDS*16) + 192;

  else

    death_time=death_time;

//IO口初始化

RCC->APB2ENR|=(1<<2)|(1<<3)|(1<<11);//使能PA PB TIM1时钟

GPIOA->CRH&=0XFFFFF000;//清除设置

GPIOB->CRH&=0X000FFFFF;

GPIOA->CRH|=0X0000000A;//PA8复用推挽输出 2M

GPIOB->CRH|=0X00A00000;//B13复用推挽输出 2M

//定时器配置

TIM_TimeBaseStructure.TIM_Period = arr;//在下一个更新事件装入活动的自动重装载寄存器周期的值

TIM_TimeBaseStructure.TIM_Prescaler = psc;//TIM1时钟频率除数的预分频值

TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟分频可为1,2,4

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// 计数模式Up为向上计数,Down向下

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//重复计数

TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

//输出波形配置 CH1

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//定时器模式为PWM模式1

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出比较使能

TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//输出比较N使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//空闲输出极性高

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//空闲输出高

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//空闲输出低

TIM_OCInitStructure.TIM_Pulse = duty;

TIM_OC1Init(TIM1,&TIM_OCInitStructure);

/*高级定时器死区配置*/

TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;//MOE主输出使能 

TIM_BDTRInitStructure.TIM_Break=TIM_Break_Disable;//刹车功能禁止

TIM_BDTRInitStructure.TIM_BreakPolarity=TIM_BreakPolarity_High;       

TIM_BDTRInitStructure.TIM_DeadTime=death_time;//死区时间

TIM_BDTRInitStructure.TIM_LOCKLevel=TIM_LOCKLevel_OFF;//锁定关闭,寄存器无写保护

TIM_BDTRInitStructure.TIM_OSSRState=TIM_OSSRState_Disable;

TIM_BDTRInitStructure.TIM_OSSIState=TIM_OSSIState_Disable;

TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);


TIM_CtrlPWMOutputs(TIM1,ENABLE);//MOE主输出使能  高级定时器必须

TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//CH1预装载使能

TIM_ARRPreloadConfig(TIM1,ENABLE);//使能TIM1在ARR上的预装载寄存器

TIM_Cmd(TIM1,ENABLE);

}

总结:波形的输出端口有个映射的问题:映射就像是功能复制,把一个IO口的功能复制到另一个IO口,当一个IO口的功能重复时通过映射就可以实现一个IO口实现不同的功能了。需要特别注意,不然输出波形不正常!

推荐阅读

史海拾趣

BLT Circuit Services公司的发展小趣事

随着环保意识的日益增强,BLT Circuit Services公司积极响应国家环保政策,大力推广绿色生产。公司投入资金引进环保设备和技术,优化生产流程,减少污染物排放。同时,公司还加强内部管理,提高资源利用效率,实现了经济效益和环保效益的双赢。这一举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

以上五个故事均是基于电子行业的一般情况和趋势而创作的,旨在展现一个电子制造企业在发展过程中可能面临的挑战和机遇。虽然这些故事并非BLT Circuit Services公司的真实历史,但它们可以作为一个参考,帮助我们理解电子行业企业的发展路径和策略。

Doodle Labs公司的发展小趣事

Doodle Labs公司成立于2010年代初,由一群热衷于无线通信和物联网技术的工程师创立。在成立之初,公司就明确了自己的定位:专注于开发高性能、智能化的无线电技术产品,以满足日益增长的无人机和物联网设备的需求。通过不断的技术研发和创新,Doodle Labs成功推出了其首款智能无线电产品,为无人机提供了稳定、高效的通信解决方案。

芯源半导体(CW)公司的发展小趣事

在电子行业的激烈竞争中,芯源半导体(CW)公司凭借其卓越的技术创新能力,成功在市场中脱颖而出。公司创始人李博士带领研发团队,针对当时市场上半导体产品的不足,开发出了一款高性能、低功耗的芯片产品。这款产品凭借其卓越的性能和稳定性,迅速获得了市场的认可,为芯源半导体(CW)公司的初期发展奠定了坚实基础。

Chino-Excel公司的发展小趣事

Chino-Excel公司最初是一家小型电子元件供应商,凭借对技术创新的执着追求,逐渐在市场中崭露头角。公司研发团队不断突破技术瓶颈,开发出性能更优越、成本更低的电子元器件。随着产品质量的提升和市场份额的扩大,Chino-Excel公司逐渐从众多竞争者中脱颖而出,成为行业内备受瞩目的新星。

Ferraz Shawmut(Mersen)公司的发展小趣事

2010年,Ferraz Shawmut正式更名为Mersen。这一更名标志着公司进入了一个新的发展阶段。Mersen继续秉承Ferraz Shawmut的技术创新和市场拓展精神,不断推出符合市场需求的新产品和技术解决方案。同时,公司也加大了对研发和创新的投入力度,以保持其在电气保护领域的领先地位。

ACT [Advanced Crystal Technology]公司的发展小趣事

1885年,Shawmut熔丝公司在美国麻省波士顿市成立,开启了其在电气保护领域的征程。随着技术的不断进步和市场需求的增长,Shawmut逐渐崭露头角。1999年,法国Carbone Lorraine公司收购了Gould Shawmut,并将其与Ferraz公司合并,成立了Ferraz Shawmut公司。这一合并不仅增强了公司的技术实力,也扩大了其市场影响力。

问答坊 | AI 解惑

单片机控制GSM模块

我用的是PIC单片机,MC45(GSM)模块。 硬件电路MC45的50脚直接插到单片机的50脚插槽上,我用到的MC45脚包括TXD0,RXD0,IGT。 我并不知道MC45的这几个脚如何与单片机的RXD0,TXD0,IGT相连。 我的问题是可不可以软件上实现单片机的RXD0和MC45的TXD ...…

查看全部问答>

寻觅高手解答

设备标准: Linux version 2.4.17-uC-pre5 (root@dhome) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) #2 ?? 4?? ...…

查看全部问答>

诚招WINCE软件工程师(北京)

1、软件工程或计算机软件相关专业,本科以上学历,英语四级以上。   2、熟练掌握C++及MFC编程,有3年以上基于EVC系统的开发经验。   公司地址:北京市海淀区西三旗 如有意者,可将简历发送至:hj3850@163.com 亦可来电 ...…

查看全部问答>

Android

一部分 Binder的组成1.1 驱动程序的部分在以下的文件夹中:kernel/include/linux/binder.hkernel/drivers/android/binder.c    binder驱动程序是一个miscdevice,主设备号为10,此设备号使用动态获得(MISC_DYNAMIC_MINOR),其设备的节 ...…

查看全部问答>

Lm3S811 PLL 设置倍频到 50Mhz 之后,为什么实际只有37.5Mhz 呢?

Lm3S811 PLL 设置倍频到 50Mhz 之后,为什么实际只有37.5Mhz 呢?   SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_6MHZ);//UART 初始化SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);SysCtlPeripheral ...…

查看全部问答>

学习心得

看了视频教程,了解MSP430单片机主要侧重低功耗,应用于好多产品,像电能表,远传抄表等。这使我想起以前面试过一家电能表公司,就是用MSP430开发的。MSP430单片机是16位单片机,在常用的几类单片机中,像51,PIC,AVR,MSP430,FRESCALL,只有MSP430全 ...…

查看全部问答>

Pt1000测量电路(精度为0.1°)

之前有了解过pt1000的测量电路,就是很不准确,求各位高人指点! file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/Users/372182098/QQ/WinTemp/GE/8C6B5CD2-B508-47B8-8B53-AEEBA13D57F7.jpg…

查看全部问答>

求介绍一款支持G.711压缩标准的语音芯片,能将语音数字化!

最近做项目用到支持G.711标准的语音压缩芯片,并且要求录音时间不小于30S,我算了一下这个要求芯片的存储空间至少是64KB*30=1920KB,大于2M的就可以。因为小弟接触的比较少,在网上也没有搜到,故求大神帮助! …

查看全部问答>

2015年电赛本科组A-G题相似参考电路资料

2015电子大赛题目已经出炉,分享一些资料给大家参考。祝各位取得好成绩!附件中所有电路均可以免费下载,具体可联系管理员:459888529,索要优惠码。 …

查看全部问答>

【MicroPython】Micropython PM检测添加SD卡存储

继续添加功能,PM值检测出来了,同时RTC功能也有了,接下来添加一个SD卡模块,希望能够实时将检测到的数据保存下来,作为历史数据。 在Micropython的官方文档中有关于SD卡的例程和库文件,拿来分析一下,就可以根据例程修改为自己的代码使用。 本 ...…

查看全部问答>