ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于中颖单片机PWM功能使用的一点经验1——定时器模拟PWM

2022-03-01 01:03:13  阅读:193  来源: 互联网

标签:输出 定时器 电机 中断 单片机 中颖 调速 PWM


 

作为一名电子工程师,用单片机引脚输出PWM波形这个事情大家肯定都做过。

而常用的两种PWM输出方式就是定时器模拟PWM信号和专用的PWM定时器生成PWM信号。

两种方式可以说是各有优劣。

使用定时器模拟PWM信号优点是不挑引脚,只要是具有输出功能的IO口就可以完成,非常灵活;而缺点就是占用定时器资源,且无法做到比较高的频率。

使用专用的PWM定时器的话,优点是编程简单,只需要配置相应的寄存器即可,频率可以做的相对比较高;缺点就是一般都需要特定的IO口进行输出。

前段时间我在中颖MCU上把两种方式都试了一下,并且遇到了一个小小的问题,在这里分享给大家。

我用的芯片型号是SH79F3214,这个芯片有一个12位的PWM定时器。

我首先做的是一个电机调速控制板,是在原有的电机开关控制的功能上增加调速功能。原有的电机驱动芯片用的是AT8870,之前用的是电平控制,很简单,需要的时候把其中一个控制脚拉高即可;拉高另一个控制脚,就是输出极性更换,即电机反转。

AT8870这颗芯片的控制脚有PWM整流/限流功能,因此做电机调速直接把控制脚改成PWM输出即可,无需修改硬件电路。

由于控制电机调速无需太高的PWM频率,再加上现有的硬件条件IO口受限,因此我选用了定时器模拟PWM输出的方式进行。期望的PWM输出频率为5kHz,可分为20步调整,无需太精细的变化调整。

先选一个定时器,这里我选用的是定时器5,因为之前定时器5空闲。

首先初始化定时器5,定时时间设为10us。

 

注意,这部分代码要切换到BANK1里运行,因为这些寄存器地址在BANK1里。

其中CLOCK_10US是基于系统时钟16MHz和定时器时钟分频配置选择而定义的常量,HIBYTE()和LOBYTE()分别是取一个数据的高八位和低八位。

 

然后在定时器5中断里进行端口控制,完成PWM输出的模拟过程。

 

定时器5中断地址为interrupt 1,中断处理函数里面前后部分分别是压栈和出栈动作。
pwm_cnt是中断计数变量,通过这个变量来控制占空比。
PWM_ALL为整个PWM周期期间进入定时器5中断的次数,这里为20次(每次10us,即200us一个周期,频率为5kHz)。
PWM_High为高电平保持的中断次数,通过改变这个变量的值,即可控制PWM的占空比。
PWM_HIGH()和PWM_LOW()分别是IO端口输出高和输出低的宏定义。

 

完成这些配置,并完成中断配置(允许总中断和定时器5重点)之后,即可完成PWM信号的输出。
然后通过两个按键来完成PWM占空比的调整。

 

到这里,通过定时器模拟PWM输出的这部分功能就完成了。这部分代码加到原来的控制板代码里,整合之后即可完成电机调速功能。

至于使用PWM定时器输出PWM信号的部分,放到下一篇文章里吧。

---------------------
作者:blust5
链接:https://bbs.21ic.com/icview-3198814-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

标签:输出,定时器,电机,中断,单片机,中颖,调速,PWM
来源: https://www.cnblogs.com/ic-dianzi/p/15948346.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有