脉冲产生器 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 已知问题, 并优化部份代码。
楼主严谨负责的精神非常值得我们学习! 这个东西非常好!顺便请问楼主,能正常产生的频率范围和精度大概是多少?原来曾有个类似的需求,要求精度高于1%,能产生20Hz~45KHz的占空比1:1脉冲,您这个代码能实现不? 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
“暂时不需要脉冲时, 停止调用 generator() 即可”,我想请教怎样来停止调用?
页:
[1]