用SimpleTimer产生PWM信号,调整占空比
搜索了帖子,好像只有改变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');*/
}
请指正 用步进电机的那个库可以改占空比啊,你要用avr的pwm,不用占cpu时钟 是啊,328有4个PWM,但是4个不是完全一样的.
页:
[1]