liangquan 发表于 2015-3-19 16:02:17

用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');*/
}

请指正

bigmango 发表于 2015-3-19 19:46:48

用步进电机的那个库可以改占空比啊,你要用avr的pwm,不用占cpu时钟

bigmango 发表于 2015-3-20 21:09:53

是啊,328有4个PWM,但是4个不是完全一样的.
页: [1]
查看完整版本: 用SimpleTimer产生PWM信号,调整占空比