————————————————————————————————————————————
PWM(脉冲宽度调制)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计要求:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
电路功能:
第一个放大器的作用是反相,将P2.0口输出的电压反相,得到一个绝对值相等的负电压。R1和R2阻止相同,不放大。
第二个放大器的作用是放大电压,并再次反相。放大倍数是R4:R5=1000:100=10倍。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实验现象:
- 首次按下按钮时,n=0,占空比0%,P2.0低电平10ms,高电平0ms,电机不转。
- 第二次按下按钮,n=1,占空比10%,P2.0低电平9ms,高电平1ms,电机转1ms停9ms。
- 第三次按下按钮,n=2,占空比20%,P2.0低电平8ms,高电平2ms,电机转2ms停8ms。
- ...
- 十次循环过后n=0,重新开始
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
元件清单:
- BUTTON
- AT89C51
- MOTOR
- RES,p.s.严格对应图中阻止
- OPAMP
- COUNTER TIMER,p.s.COUNTER TIMER(频率计)设置OperatingMode项为frequency
- Digital Oscilloscope
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实现代码:
1 #include <reg52.h>
2 typedef unsigned char uchar;
3 typedef unsigned int uint;
4 sbit PWM = P2 ^ 0;
5 uchar n = 0;
6 void Delay(uchar m)
7 {
8 uchar a, b, c;
9 while(m--)
10 for (c = 19; c > 0; --c)
11 for (b = 20; b > 0; --b)
12 for (a = 130; a > 0; --a);
13 }
14 void PWMout(uchar n)
15 {
16 PWM = 0; //先置PWM信号为低电平,此时可以看到在波形图上出现波峰
17 Delay(10 - n); //延时10-n(ms)
18 PWM = 1; //置PWM信号为高电平,此时波形图出现波谷
19 Delay(n); //延时n(ms)
20 }
21 int main()
22 {
23 EA = 1; //通过按钮中断来修改n的值
24 EX0 = 1;
25 IT0 = 1;
26 while(1)
27 {
28 PWMout(n); //脉冲输出子程序
29 }
30 }
31 void Int0()interrupt 0
32 {
33 if (n == 10) //n在0-10中循环
34 n = 0;
35 else ++n;
36 }