学长 发表于 2013-5-6 22:20:55

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

本帖最后由 学长 于 2013-8-27 16:07 编辑

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

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

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

故修正後, 重新上传

PulseGenFree.h 设计不变, 变数名称重写。
/*
PulseGenFree.h - Library for Pulse Generator Free
Created by Andy Huang, May,6,2013.
Tradition Chinese Forum http://bbs.game7777.net
Tradition Chinese wiki http://www.game7777.net
Special Thanks: 星空, 看海的日子, 夜, Boku , 小清新, 咖啡冻, darkorigin


特性:
1. 不停止 cpu 运行, 不使用 delay() delaymicroseconds() 。
2. 脉冲计数。(Not implement yet, infact you can do it very simple.)
3. 指定脉冲 on off 时间, us 微秒。
4. 可同时使用多个引脚进行不同脉冲。

使用方式:
1. 建构时指定 引脚 on时间 off 时间
2. 每个循环调用 generator()
3. 暂时不需要脉冲时, 停止调用 generator() 即可
4. 重新需要输出脉冲时,必须先调用 init() 一次。时间及计数归零。

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


#ifndef PulseGenFree_h
#define PulseGenFree_h

#include "Arduino.h"

class PulseGenFree{
public:
        /* 建立 pulse
        /* @param pin                         第几引脚
        /* @param onInterval        脉冲 ON 的时间 微秒 us
        /* @param offInterval        脉冲 OFF 的时间 微秒 us
        */
        PulseGenFree(int pin,unsigned int onInterval,unsigned int offInterval);
       
        /* 重新初始化
        /* @param onInterval        脉冲 ON 的时间 微秒 us
        /* @param offInterval        脉冲 OFF 的时间 微秒 us
        */
        void init(unsigned int onInterval,unsigned int offInterval);
       
        /* 执行
        */
        void generator();
       

       
private:

        int _pin;                                                        //指定引脚
        unsigned long pulseOnInterval;                //on时间
        unsigned long pulseOffInterval;                //off时间
       
        unsigned long oldTime;                                //比对用
        unsigned long newTime;                                //比对用
       
        bool pulseState;                                        //脉冲状态

};

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

void setup() {
}

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

fangtaonj 发表于 2013-5-7 14:11:46

楼主严谨负责的精神非常值得我们学习!

fangtaonj 发表于 2013-5-7 14:14:32

这个东西非常好!顺便请问楼主,能正常产生的频率范围和精度大概是多少?原来曾有个类似的需求,要求精度高于1%,能产生20Hz~45KHz的占空比1:1脉冲,您这个代码能实现不?

学长 发表于 2013-5-7 14:35:48

fangtaonj 发表于 2013-5-7 14:14 static/image/common/back.gif
这个东西非常好!顺便请问楼主,能正常产生的频率范围和精度大概是多少?原来曾有个类似的需求,要求精度高 ...

基本上光是使用 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

1573782356 发表于 2015-4-6 22:03:10

“暂时不需要脉冲时, 停止调用 generator() 即可”,我想请教怎样来停止调用?
页: [1]
查看完整版本: 脉冲产生器 130506 改邪归正自由版