|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2021-7-17 15:06:33
|
显示全部楼层
PWM
3、PWM的应用。
在开发板中,PWM主要应用在蜂鸣器和小电机中。接下来编两个程序来进行实验。
(1)调速小马达
![](https://www.haohaodada.com/new/bbs/forum.php?mod=image&aid=1968&size=300x300&key=52259883d5888583&nocache=yes&type=fixnone)
通过这个小马达程序探究占空比和和输出的关系。
这个程序的输出结果是电机由慢到快再由快到慢转动。占空比的原理是
![](https://www.haohaodada.com/new/bbs/forum.php?mod=image&aid=1969&size=300x300&key=08038c448fab635b&nocache=yes&type=fixnone)
占空比越大,在一个脉冲周期中高电平的时间就越长。结果就是输出越高,在程序中i达到1000时,小电机转速最快,随后慢慢降低。
(2)蜂鸣器
理论上来说,利用PWM,可以通过蜂鸣器编出一个乐曲。
我在网络上找到了一个声调和频率的关系图。定义这些常量之后方便输入乐谱。
![](https://www.haohaodada.com/new/bbs/forum.php?mod=image&aid=1970&size=300x300&key=fd69eafc47e880c2&nocache=yes&type=fixnone)
定义一个全局变量数组并在里面编曲。
[url=] [/url]
这个函数用来播放
void loop()
{
for (i = (0); i < (sizeof(song)/sizeof(song[0])); i = i + 1) {
pwm_freq_duty(PWM5_P00, song[(int)(i)], 200);//pwm调整三个参数分别是引脚、频率、占空比10/PWM_DUTY_MAX
delay(durt[(int)(i)]);
//
}
}
运行测试,没问题。之后就可以自己想编什么曲编什么了。
附代码:
#define PWM_DUTY_MAX 1000//PWM最大占空比值
#define Do 495
#define Re 556
#define Mi 624
#define Fa 661
#define Sol 742
#define La 833
#define Si 935
#define hDo 990
#define hRe 1112
#define hMi 1178
#define hFa 1322
#define hSol 1484
#define hLa 1665
#define hSi 1869
#define dDo 248
#define dRe 278
#define dMi 294
#define dFa 330
#define dSol 371
#define dLa 416
#define dSi 467
#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "lib/PWM.h"
#include "lib/delay.h"
uint16 i = 0;
code uint16 song[]={dMi, dFa, dSol, dLa, Mi, Do, Re, Do, dMi, dFa, dSol, dLa, Mi, Do, dLa, Re, Mi, dMi, dFa, dSol, dLa, Mi, Do, dLa, };
code uint16 durt[]={250,250, 250, 250, 500, 250, 750, 750, 250, 250, 250, 250, 500, 250,250,750,750,250,250,250,250,600};
void setup()
{
twen_board_init();//天问51初始化
pwm_init(PWM5_P00, 1000, 300);//pwm初始化三个参数分别是引脚、频率、占空比10/PWM_DUTY_MAX
}
void loop()
{
for (i = (0); i < (sizeof(song)/sizeof(song[0])); i = i + 1) {
pwm_freq_duty(PWM5_P00, song[(int)(i)], 200);//pwm调整三个参数分别是引脚、频率、占空比10/PWM_DUTY_MAX
delay(durt[(int)(i)]);
//
}
}
void main(void)
{
setup();
while(1){
loop();
}
}
|
|