文章目录
- 系列文章目录
- 前言
- 一、新建工程
- 二、PWM相关了解
- 1.PWM了解
- 2.硬件电路了解
- 三、PWM实现
- 1.代码实现
- 总结
系列文章目录
第一章 HT单片机环境搭建
第二章 点亮第一个LED灯
第三章 按键
第四章 定时器
第五章 PWM
第六章 时基中断
第七章 LCD
前言
PWM 信号把模拟信号转化为数字电路所需要的编码,现在基本是采用数字电路,因此在很多场合都采用 PWM 信号,我们经常见到的就是交流调光电路,也可以说是无级调速,高电平占多一点,也就是占空比大一点亮度就亮一点,占空比小一点亮度就没有那么亮,前提是 PWM 的频率要大于我们人眼识别频率,要不然会出现闪烁现象。(ps:明基出的护眼灯ScreenBar Plus就是用PWM调光外加一个档光板实现的,卖999。)除了在调光电路应用,还有在无源蜂鸣器驱动、电机驱动、逆变电路、加湿机雾化量等都会有应用。一、新建工程
请参照第二章第一节新建工程
——》第二章 点亮第一个LED灯
二、PWM相关了解
1.PWM了解
PWM指脉冲宽度调制(Pulse Width Modulation),,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是 50%。
1)PWM方波的周期是固定的。无论我们使用单片机、树莓派或者PLC,在让其产生PWM波形之前,都首先要设置波形的周期。比如可以是100ms,也可以是50us等等。一旦该时间值确定,其波形的周期就确定了,不会在波形的产生过程中发生更改,除非你停止PWM功能再次更改周期值;
2)PWM方波的宽度是可以调节的。这里的宽度,是指方波中高电平持续的时间,显然,这个时间的范围是0方波的周期,也就是周期时间的0100%。这种改变方波脉冲宽度的技术,就是脉冲宽度调制(PWM)技术。
比如下面这张图:T是波形的周期,它是固定值;在一个周期中,脉冲的宽度是不同的,有三种:25%、50%和75%,这就是通过PWM技术产生不同脉冲宽度的波形。
2.硬件电路了解
本章我们将用PWM驱动无源蜂鸣器。无源蜂鸣器利用电磁感应现象,为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声,接入直流电只能持续推动振膜而无法产生声音,只能在接通或断开时产生声音。
无源蜂鸣器的优点是:
1.制作成本低
2.声音频率范围宽,可以做出“多来米发索拉西”的效果(ps:很带音乐播放的小玩具,基本都用PWM驱动无源蜂鸣器实现)
以下为我的开发板硬件电路。
三、PWM实现
1.代码实现
我们实现的功能:0.5s无源蜂鸣器鸣叫一声。假如你想改变音调,可以尝试改变_tm1rpl 和_tm1al寄存器的值。
#include "HT66F0185.h"/******************************************************************************** @fn delayMs * @brief 延时函数* @param 延时时间 单位为ms* @return 无*******************************************************************************/
void delayMs(unsigned long int ms){while(ms--)GCC_DELAY(2000);//主频8Mhz,执行一条指令为0.5us。一条指令周期等于四条机器周期——》 1/8Mhz * 4 = 0.5us
}/******************************************************************************** @fn pwmInit * @brief pwm初始化* @param 无* @return 无*******************************************************************************/
void pwmInit(void){/*设置PA7端口复用功能*/ _pac7 = 0;//设置PA7口为输出_pa7 = 1; //PA7输出高电平_t1cp = 1;//设置引脚为TIM1端口/*设置TM1C1寄存器*/_t1m1 = 1;_t1m0 = 0;//设置为PWM输出模式_t1io1 = 1;_t1io0 = 0;//设置TIM1引脚为PWM输出_t1oc = 1;//引脚输出高电平有效_t1pol = 0;//引脚输出同相_t1cclr = 0;//TIM1使用比较器P/** 其中细心的朋友发现少一个T1DPX的配置。 * T1DPX:TM1 PWM周期/占空比控制位* 0:CCRP - 周期;CCRA - 占空比* 1:CCRP - 占空比;CCRA - 周期* 我们一般采用默认0。CCRP控制周期 CCRA控制占空比** 以上对TM1C1寄存的配置简写为==》_tm1c1 = 0b10101000* *//*设置TIM1时钟 = fH / 16 = 500KHz = 2us*/_t1ck2 = 0;_t1ck1 = 1;_t1ck2 = 0;/*设置周期 = fsys / 16 / 125 = 4KHz*/_tm1rpl = 125;_tm1rph = 0;/*设置占空比 = 62 / 125 = 49.6%*/_tm1al = 62;_tm1ah = 0;/*使能定时器*/_t1on = 1;}/******************************************************************************** @fn main * @brief 主函数* @param 无* @return 无*******************************************************************************/
void main(){_wdtc = 0b10101000;//关闭看门狗。直接配置看门狗寄存器,0b代表二进制。_acerl=0;//模拟端口关闭/*PWM初始化*/ pwmInit();/*循环*/while(1){_t1on = 0;/*延时500ms*/delayMs(500);_t1on = 1;/*延时500ms*/delayMs(500);}}
工程链接—》PWM