极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11284|回复: 2

用SimpleTimer产生PWM信号,调整占空比

[复制链接]
发表于 2015-3-19 16:02:17 | 显示全部楼层 |阅读模式
搜索了帖子,好像只有改变PWM信号频率的方法,而没有改变占空比的介绍。

我想要控制一个高速开关阀,其根本目的是控制PWM的占空比。最终我用SimpleTimer库实现(也许)了PWM信号占空比的改变,但不知是否正确,贴到这里,请大家指正。

电路图


  1. // pwm change pwm frequency and dutycycle
  2. #include <SimpleTimer.h>

  3. int ledPin = 2; // 输出PWM信号的引脚

  4. int analog_pin = 0; // 模拟口,接收变阻器的输入

  5. int val = 0;  // 当前计数值
  6. int old_val = 0; // 上一个计数值,可以发现更改

  7. SimpleTimer timer;  // Timer

  8. boolean pwmState;

  9. int OnNumber = 20; // 高电平的时间,ms
  10. int OffNumber = 20; // 低电平的时间,ms

  11. int number;  // 计数用

  12. // 定时中断执行程序,每1ms执行一次
  13. void OnTask()
  14. {
  15.   number++;
  16.   if (pwmState)    // 高电平所占时间
  17.   {
  18.     if (number > OnNumber)
  19.     {  
  20.       //Serial.println("PWM Off");
  21.       digitalWrite(ledPin, LOW);
  22.       number =0;
  23.       pwmState = false;
  24.     }
  25.   }
  26.   else // 高电平所占时间
  27.   {
  28.     if (number > OffNumber)
  29.     {
  30.       //Serial.println("PWM On");
  31.       digitalWrite(ledPin, HIGH);
  32.       number = 0;
  33.       pwmState = true;
  34.     }
  35.   }
  36.   
  37.   // read analog port
  38.   val = analogRead(analog_pin);
  39.   
  40.   //Serial.print(val);
  41.   //Serial.print('\t');
  42.   
  43.   // 如果当前值和上一次的不同,说明调整了变阻器
  44.   if (old_val > val)
  45.   {
  46.     OnNumber = OnNumber - 1;
  47.     OffNumber = OffNumber + 1;
  48.     if (OnNumber < 0)
  49.     {
  50.       OnNumber = 0;
  51.       OffNumber = 40;
  52.     }
  53.   }
  54.   else if (old_val < val)
  55.   {
  56.     OnNumber = OnNumber + 1;
  57.     OffNumber = OffNumber - 1;
  58.     if (OffNumber < 0)
  59.     {
  60.       OnNumber = 40;
  61.       OffNumber = 0;
  62.     }
  63.   }
  64.   
  65.   old_val = val;
  66. }

  67. void setup()
  68. {
  69.   Serial.begin(9600);  
  70.   pinMode(ledPin, OUTPUT);  
  71.   timer.setInterval(1,OnTask);  
  72.   pwmState = true;  
  73.   digitalWrite(ledPin, LOW);
  74. }

  75. void loop()
  76. {
  77.   timer.run();
  78.   /*
  79.   Serial.print(number);
  80.   Serial.print('\t');
  81.   
  82.   Serial.print(OnNumber);
  83.   Serial.print(' ');
  84.   Serial.print(OffNumber);
  85.   Serial.print('\n');*/
  86. }
复制代码


请指正

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-3-19 19:46:48 | 显示全部楼层
用步进电机的那个库可以改占空比啊,你要用avr的pwm,不用占cpu时钟
回复 支持 反对

使用道具 举报

发表于 2015-3-20 21:09:53 | 显示全部楼层
是啊,328有4个PWM,但是4个不是完全一样的.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 12:14 , Processed in 0.033953 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表