|
|
搜索了帖子,好像只有改变PWM信号频率的方法,而没有改变占空比的介绍。
我想要控制一个高速开关阀,其根本目的是控制PWM的占空比。最终我用SimpleTimer库实现(也许)了PWM信号占空比的改变,但不知是否正确,贴到这里,请大家指正。
电路图
- // pwm change pwm frequency and dutycycle
- #include <SimpleTimer.h>
- int ledPin = 2; // 输出PWM信号的引脚
- int analog_pin = 0; // 模拟口,接收变阻器的输入
- int val = 0; // 当前计数值
- int old_val = 0; // 上一个计数值,可以发现更改
- SimpleTimer timer; // Timer
- boolean pwmState;
- int OnNumber = 20; // 高电平的时间,ms
- int OffNumber = 20; // 低电平的时间,ms
- int number; // 计数用
- // 定时中断执行程序,每1ms执行一次
- void OnTask()
- {
- number++;
- if (pwmState) // 高电平所占时间
- {
- if (number > OnNumber)
- {
- //Serial.println("PWM Off");
- digitalWrite(ledPin, LOW);
- number =0;
- pwmState = false;
- }
- }
- else // 高电平所占时间
- {
- if (number > OffNumber)
- {
- //Serial.println("PWM On");
- digitalWrite(ledPin, HIGH);
- number = 0;
- pwmState = true;
- }
- }
-
- // read analog port
- val = analogRead(analog_pin);
-
- //Serial.print(val);
- //Serial.print('\t');
-
- // 如果当前值和上一次的不同,说明调整了变阻器
- if (old_val > val)
- {
- OnNumber = OnNumber - 1;
- OffNumber = OffNumber + 1;
- if (OnNumber < 0)
- {
- OnNumber = 0;
- OffNumber = 40;
- }
- }
- else if (old_val < val)
- {
- OnNumber = OnNumber + 1;
- OffNumber = OffNumber - 1;
- if (OffNumber < 0)
- {
- OnNumber = 40;
- OffNumber = 0;
- }
- }
-
- old_val = val;
- }
- void setup()
- {
- Serial.begin(9600);
- pinMode(ledPin, OUTPUT);
- timer.setInterval(1,OnTask);
- pwmState = true;
- digitalWrite(ledPin, LOW);
- }
- void loop()
- {
- timer.run();
- /*
- Serial.print(number);
- Serial.print('\t');
-
- Serial.print(OnNumber);
- Serial.print(' ');
- Serial.print(OffNumber);
- Serial.print('\n');*/
- }
复制代码
请指正 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|