极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11105|回复: 4

脉冲产生器 130506 改邪归正自由版

[复制链接]
发表于 2013-5-6 22:20:55 | 显示全部楼层 |阅读模式
本帖最后由 学长 于 2013-8-27 16:07 编辑

原帖:
http://www.geek-workshop.com/thread-4409-1-2.html

本脉冲产生器撰写时,  因为未参考原作者写的文章 How to write  libraries for the Arduino? , 翻译地址在最底下
以至於使用了 学长 所习惯比较不严谨的命名方式。

今天再上传一个完全以文章内所建议的方式,将全部命名修改。另建文章以示区别。
并感谢 群内、站内各位高手,如下
星空, 看海的日子, 夜, Boku , 小清新, 咖啡冻, darkorigin 等高手,
协助测试, 并提供宝贵建议。

故修正後, 重新上传

PulseGenFree.h 设计不变, 变数名称重写。
  1. /*
  2.   PulseGenFree.h - Library for Pulse Generator Free
  3.   Created by Andy Huang, May,6,2013.
  4.   Tradition Chinese Forum [url]http://bbs.game7777.net[/url]
  5.   Tradition Chinese wiki [url]http://www.game7777.net[/url]
  6.   Special Thanks: 星空, 看海的日子, 夜, Boku , 小清新, 咖啡冻, darkorigin
  7.   
  8.   
  9.   特性:
  10.   1. 不停止 cpu 运行, 不使用 delay() delaymicroseconds() 。
  11.   2. 脉冲计数。(Not implement yet, infact you can do it very simple.)
  12.   3. 指定脉冲 on off 时间, us 微秒。
  13.   4. 可同时使用多个引脚进行不同脉冲。
  14.   
  15.   使用方式:
  16.   1. 建构时指定 引脚 on时间 off 时间
  17.   2. 每个循环调用 generator()
  18.   3. 暂时不需要脉冲时, 停止调用 generator() 即可
  19.   4. 重新需要输出脉冲时,必须先调用 init() 一次。时间及计数归零。

  20.   注意事项:
  21.   1. 暂停後重新启动脉冲, 如果未先呼叫 init() , 第一次所产生的脉冲时长最多可能达到71.5分钟。
  22. */


  23. #ifndef PulseGenFree_h
  24. #define PulseGenFree_h

  25. #include "Arduino.h"

  26. class PulseGenFree{
  27. public:
  28.         /* 建立 pulse
  29.         /* @param pin                         第几引脚
  30.         /* @param onInterval        脉冲 ON 的时间 微秒 us
  31.         /* @param offInterval        脉冲 OFF 的时间 微秒 us
  32.         */
  33.         PulseGenFree(int pin,unsigned int onInterval,unsigned int offInterval);
  34.        
  35.         /* 重新初始化
  36.         /* @param onInterval        脉冲 ON 的时间 微秒 us
  37.         /* @param offInterval        脉冲 OFF 的时间 微秒 us
  38.         */
  39.         void init(unsigned int onInterval,unsigned int offInterval);
  40.        
  41.         /* 执行
  42.         */
  43.         void generator();
  44.        

  45.        
  46. private:

  47.         int _pin;                                                        //指定引脚
  48.         unsigned long pulseOnInterval;                //on时间
  49.         unsigned long pulseOffInterval;                //off时间
  50.        
  51.         unsigned long oldTime;                                //比对用
  52.         unsigned long newTime;                                //比对用
  53.        
  54.         bool pulseState;                                        //脉冲状态

  55. };

  56. #endif
复制代码
设计不变, 一样简单易用
  1. #include <PulseGenFree.h>
  2. PulseGenFree pulseFree(7,5000,5000); //七號引腳 產生 5000us on, 5000us off 脈衝

  3. void setup() {
  4. }

  5. void loop() {
  6.   pulseFree.generator();
  7. }
复制代码
本次修正 .cpp 已知问题, 并优化部份代码。

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-5-7 14:11:46 | 显示全部楼层
楼主严谨负责的精神非常值得我们学习!
回复 支持 反对

使用道具 举报

发表于 2013-5-7 14:14:32 | 显示全部楼层
这个东西非常好!顺便请问楼主,能正常产生的频率范围和精度大概是多少?原来曾有个类似的需求,要求精度高于1%,能产生20Hz~45KHz的占空比1:1脉冲,您这个代码能实现不?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-7 14:35:48 | 显示全部楼层
fangtaonj 发表于 2013-5-7 14:14
这个东西非常好!顺便请问楼主,能正常产生的频率范围和精度大概是多少?原来曾有个类似的需求,要求精度高 ...

基本上光是使用 arduino 是无法实现的

原因如下:
1. Arduino 的每个引脚 PWM, 官方提供的数据为 490Hz 。故无法达到 45KHz。
2. 官方所提供数据 16MHz 的 us 精度在 4us , 8MHz 的 us 精度在 8us 。
  所以, 当使用 16MHz 的板子 脉冲宽度低於 100us 时, 精度误差就高於1%。
  如果使用 8MHz 的板子 脉冲宽宽低於 200us 时, 精度误差也高於1%。

以上两点, 都是硬件上的限制。

就以理论层面来说, 不考虑硬件限制,只讨论程序代码的话,频率范围和精度 是完全足够的。

另外, 这个脉冲产生器,所产生的脉冲是以 脉宽 为基础 ,
如果要以 频率 为基础 不妨另外再写一个, 会比较符合方便使用的目的。

引用官方数据 引脚 PWM 频率
http://arduino.cc/de/Reference/AnalogWrite

引用官方数据 microseconds (us)精度
http://arduino.cc/de/Reference/Micros
回复 支持 反对

使用道具 举报

发表于 2015-4-6 22:03:10 | 显示全部楼层
“暂时不需要脉冲时, 停止调用 generator() 即可”,我想请教怎样来停止调用?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 04:58 , Processed in 0.036112 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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