历史上的今天
返回首页

历史上的今天

今天是:2024年12月25日(星期三)

正在发生

2018年12月25日 | 利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM

2018-12-25 来源:eefocus

MCU:STM32F334C8T6


PWM即脉宽调制,可以用来驱动电机,驱动全桥电路等,用过STM32的知道,用它的定时器可以很容易实现PWM输出,使用高级定时器的TIMx_CHy和TIMx_CHyN可以轻易实现互补PWM(complementary PWM)波形的输出。


高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。


STM32的定时器PWM有两种模式:PWM mode 1和PWM mode 2


工作原理:

PWM mode 1 - In upcounting, channel 1 is active as long as TIMx_CNT


In downcounting, channel 1 is inactive (OC1REF=‘0’) as long as TIMx_CNT>TIMx_CCR1 else active (OC1REF=’1’).


 PWM mode 2 - In upcounting, channel 1 is inactive as long as TIMx_CNT


In downcounting, channel 1 is active as long as TIMx_CNT>TIMx_CCR1 else inactive.


官方手册对channel 1 的说明,其他channel类似,考虑向上计数模式


方法一:

假设高电平为有效电平,即高电平为active,使用定时器3


PWM mode 1:TIM3_CNT


PWM mode 2:TIM3_CNT


可以看出,无论是mode1还是mode2,电平翻转都是在计数器TIM3_CNT中的值达到TIM3_CCR1 中的值(次数可以控制占空比,见下文)的时候


据此,可以将TIM的两个通道(如TIM3_CH1和TIM3_CH2)分别配置为mode1和mode2,那么即可输出两路互补互补PWM,此为方法一


方法二:

方法一中假设高电平为active状态,事实上active状态也可以是低电平,在这种情况下,考虑同一种模式(mode1)


acive high:TIM3_CNT


active low:TIM3_CNT


于是,同种模式下,分别将两个通道的有效电平配置为高和低,也可以实现互补PWM输出,此为方法二


在向下计数模式中原理类似,不再说明


频率和占空比的调节:


上面提到了两个寄存器:CNT和CCR1,(channel x 对应CRx)CNT中是计时器当前的计数值,CCR1中是用来比较的值,当CNT达到CCR1的值时,将发生电平转变另一个寄存器ARR,自动装载寄存器,存储的是自动装载的值,向上计数中当CNT递加达到ARR的值时将被复位,从0从新开始,而向下计数时,当CNT到达0时,ARR中的值将被自动装载到CNT重新开始递减,也就是说ARR中的值是计数周期(中心对其计数模式此处不考虑)


假设我们需要的频率为freq,占空比dutycycle,定时器使用系统频率SYSCLK,有如下关系:


ARR = SYSCLK/freq,dutycycle=CCR1/ARR


可见,通过更改ARR实现频率可调,更改CCR1实现占空比可调


部分代码:

uint16_t period=0,pulsewidth=0;


GPIO_InitTypeDef  GPIO_InitStruct;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;

TIM_OCInitTypeDef  TIM_OCInitStruct;

 

period = 72*1000000/(100*1000);//计数周期,系统频率72M,PWM输出频率100k

pulsewidth = 45*period/100;  //脉宽,占空比45%

 

//开启外设时钟

//配置GPIO

 

TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInitStruct.TIM_Period = period - 1;//ARR

//填充TIM_TimeBaseInitStruct其他参数

TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStruct);

//OCInit结构体初始化,填充完所有参数

TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStruct.TIM_Pulse = pulsewidth; //CCR1

TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;

//TIM_OC1Init()开启通道1

 

//OC2 方法1 : 修改Mode

TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;

TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;

/***********************************

//OC2 方法2 : 修改 Polarity

TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;

***********************************/

//TIM_OC2Init()开启通道2

 

//最后打开时钟

TIM_Cmd(TIM3, ENABLE);



附图为亲自测试效果,两种方法效果相同


测试基于STM32F334C8T6,频率100k,占空比45%,互补波占空比55%


推荐阅读

史海拾趣

Econais公司的发展小趣事

Econais公司成立于XXXX年,其创始人是一群在无线通信技术领域拥有深厚背景和丰富经验的工程师。他们看到了物联网(IoT)和机器对机器(M2M)通信的巨大潜力,并希望通过自己的技术,为全球的设备提供高效、稳定的无线连接方案。于是,Econais应运而生,专注于研发超低功耗(ULP)和高性能的无线模块。

EPCOS (TDK)公司的发展小趣事

2009年10月1日,EPCOS与TDK元件事业部合并,成立了TDK-EPC公司。这次合并进一步增强了EPCOS在电子元器件领域的实力,使其在全球市场中的地位更加稳固。合并后,TDK-EPC公司继续秉承EPCOS的技术创新和产品拓展战略,不断推出具有竞争力的新产品和解决方案,以满足客户日益增长的需求。

Acutechnology公司的发展小趣事

随着技术的不断进步,Acutechnology公司不断对产品进行升级和优化。公司投入大量研发资源,推出了一系列高性能、高可靠性的电子产品,满足了市场的多样化需求。同时,公司积极拓展销售渠道,与国内外多家知名企业建立了长期合作关系,产品销量逐年攀升。

G-Mag Usa公司的发展小趣事

进入21世纪后,G-Mag意识到单一产品线难以满足市场多元化需求,于是开始实施并购扩张战略。2005年,G-Mag成功收购了国内一家领先的电子元器件制造商,这次收购不仅增强了G-Mag在供应链上的控制力,还为其带来了丰富的产品线和技术储备。随后几年,G-Mag又陆续完成了对多家在传感器、无线通信等领域具有优势企业的并购,逐步构建起了一个覆盖电子产业链上下游的庞大帝国。通过并购,G-Mag不仅实现了业务的快速增长,还巩固了其在电子行业中的领先地位。

深圳杜因特(DOINGTER)公司的发展小趣事

作为一家快速发展的电子企业,杜因特深知人才是公司最宝贵的财富。因此,公司始终将团队建设和人才培养放在重要位置。通过引进优秀人才、加强内部培训等方式,杜因特打造了一支高效协作、专业精湛的团队。同时,公司还为员工提供了良好的工作环境和福利待遇,让员工能够在一个如家般的团队中做具有革新性的工作。

以上五个故事仅是基于已知信息对深圳杜因特公司发展起来的相关事实的概括性描述,具体细节可能因实际情况而有所不同。

Ememory Technology Inc公司的发展小趣事

在2022年,eMemory宣布加入英特尔晶圆代工服务加速器(Intel Foundry Services Accelerator)计划。这一合作标志着eMemory的技术得到了国际半导体巨头的认可。通过这一计划,eMemory为使用英特尔晶圆代工服务的客户提供全球领先的安全IP解决方案,进一步提升了其产品在全球市场的竞争力。

问答坊 | AI 解惑

调节阀

在化工生产中,调节阀是直接接触工艺介质的控制机构,本文以工程实际为背景,讨论了调节阀选型的原则,并介绍了在聚甲醛装置中应用调节阀的情况。 工艺简介 云南云天化股份有限公司的聚甲醛装置系国内第一套同类型装置,工艺包从波兰ZAT引进, ...…

查看全部问答>

PADS Power-PCB中文教程!

这是一本难得的中文教程,详细介绍了该软件的使用方法和过程,是学习Power-PCB软件的好教材。…

查看全部问答>

单片机判断交流电动机是否运行

我想用单片机判断  几个220V的交流电动机是否真的运行 或是关闭了  这个电路应该怎么实现   麻烦各位发表下自己的高见。…

查看全部问答>

最牛的摄像机被烧成这个样子了!

长话短说,仓库内,2个摄像机12V 10A开关电源与CDMA视频服务器一起集中供电,CDMA无线传输,使用半年左右,最近发现没有图像。经检查是电源被烧毁,输出只有6.5V。于是更换电源(在更换电源钱检查过市电为AC230V左右,电源输出12.2V),没过3分钟, ...…

查看全部问答>

RockBox on mini2440

My Mini2440 board just arrived. I did copy the file rockbox.mini2440 (the Rockbox firmware which I did build before) to .rockbox folder on SD Card. After inserted the SD Card and turned power on, and waited a few seconds, I had ...…

查看全部问答>

一个通信方面的论坛

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑 http://bbs.cnttr.com/?fromuid=488120  …

查看全部问答>

红外线遥控如何该无线遥控

请教大家一个小问题,我有一个红外线遥控MP3 音箱,红外线遥控遇到什么障碍就不听使唤、遥控距离有限,就想把遥控改成无线的,可对无线不怎么董,想请大家帮帮忙。 我在网上找到带PT2272-M4编码器的遥控收发套件,这个能改吗? …

查看全部问答>

给大家看一些资料(飞思卡尔产品中文信息)

飞思卡尔产品中文信息: 8 位微控制器与微处理器:http://www.freescale.com.cn/products/8BitMCU/Chinese_Information.asp 16位微控制器与微处理器:http://www.freescale.com.cn/products/16BitMCU/Chinese_Information.asp 68K/ColdFire:http: ...…

查看全部问答>

我的程序总显示黑色,请帮帮我,谢谢。

我编写一个程序显示一个蓝色的矩形,在模拟器下正常实现了,可是到了ARM开发板下就成了黑色,换其他颜色也无效,请教高手是什么原因啊?我用到了SetBkColor( 这个函数好像没有用)。…

查看全部问答>

wince 下用evc来写串口通信。

哪位大虾能发给我个串口通信的实例呀??最好用EVC写的。。感激涕零。\\ 我的邮箱6094189ye@163.com 我看到书上有CSerial 这个类,但STANDARDSDK下面没有这个类呀。。。???…

查看全部问答>