发作品签到
标准版

ATtiny13 TinyTacho

工程标签

3.7k
0
0
0

简介

简易转速表(RPM-Meter)

简介:简易转速表(RPM-Meter)

开源协议

CC-BY-SA 3.0

创建时间:2022-02-28 02:12:10更新时间:2022-06-17 07:29:08

描述

概述

最近 Great Scott 制作了他的DIY 版本的转速表,我认为它非常酷。但是使用 ATmega 完成这项工作,我发现有点过于强大了。所以我试图将所有任务(测量、计算、I²C 协议和 OLED 显示)强制放入 ATtiny13 的 1KByte 巨大内存中。

pic1.jpg

硬件

由于ATtiny13几乎可以完成所有任务,因此布线非常简单:


接线.png

红外LED发出光,该光被旋转物体反射并由红外光电二极管检测到。光电二极管根据反射光的强度改变其导电性。如果旋转物体在其他黑色表面上正好有一条白色条纹,则光电二极管每转改变其电阻两次,二极管和10k电阻之间的电压上升一次,并且下降一次低于某个阈值,该阈值由可变电阻定义。
pic2.jpg

如果您想使用纽扣电池为设备供电,请记住,只有可充电LIR1220锂离子电池才能工作。"普通"CR1220无法提供足够的功率。


软件

实现

红外光电二极管连接到ATtiny内部模拟比较器的正输入,用于校准的可变电阻连接到负输入。在比较器输出的每个下降沿上触发一个中断,从而保存timer0的电流值并重新启动定时器。通过使用计时器溢出中断,8 位计时器扩展为 16 位计时器。保存的计时器值包含每转的计时器计数。RPM 是利用以下等式计算得出的:

RPM = 60 * F_CPU / prescaler / counter
    = 60 * 1200000 / 64 / counter
    = 1125000 / counter

计算出的RPM值显示在I²C OLED显示屏上。I²C协议的实现基于粗略的位移方法。它是专门为ATtiny10和ATtiny13的有限资源设计的,但也应该与其他一些AVR一起使用。OLED的功能适用于SSD1306 128x32 OLED模块,但可以轻松修改以用于其他模块。为了节省资源,仅实现此应用程序所需的基本功能。有关I²C OLED实现的工作原理的详细信息,请访问TinyOLEDdemo

// global variables
volatile uint8_t  counter_enable    = 1;  // enable update of counter result
volatile uint8_t  counter_highbyte  = 0;  // high byte of 16-bit counter
volatile uint16_t counter_result    = 0;  // counter result (timer counts per revolution)

// main function
int main(void) {
  uint16_t counter_value;                 // timer counts per revolution
  uint16_t rpm;                           // revolutions per minute
  PRR    = (1<  DIDR0  = (1<  ACSR   = (1<  TIMSK0 = (1<  sei();                                  // enable all interrupts
  OLED_init();                            // initialize the OLED

  // main loop
  while(1) {                              // loop until forever
    counter_enable = 0;                   // lock counter result
    counter_value = counter_result;       // get counter result
    counter_enable = 1;                   // unlock counter result
    if (counter_value > 17) {             // if counter value is valid:
      rpm = (uint32_t)1125000 / counter_value; // calculate RPM value
      OLED_printW(rpm);                   // print RPM value on the OLED
    } else OLED_printB(slow);             // else print "SLOW" on the OLED
  }
}

// analog comparator interrupt service routine
ISR(ANA_COMP_vect) {
  if(counter_enable) counter_result = (uint16_t)(counter_highbyte << 8) | TCNT0; // save result if enabled
  TCNT0 = 0;                              // reset counter
  counter_highbyte = 0;                   // reset highbyte
  TCCR0B  = (1<}

// timer overflow interrupt service routine
ISR(TIM0_OVF_vect) {
  counter_highbyte++;                     // increase highbyte (virtual 16-bit counter)
  if(!counter_highbyte) {                 // if 16-bit counter overflows
    TCCR0B = 0;                           // stop the timer
    if(counter_enable) counter_result = 0;// result is invalid
  }
}

编译和上传

由于电路板上没有 ICSP 接头,因此在使用 SOP 适配器进行焊接之前,或使用 EEPROM 夹进行焊接后,必须对 ATtiny 进行编程。AVR 编程器适配器可以对此有所帮助。

如果使用 Arduino IDE

  • 确保您已安装微核
  • 转到工具 -> 板 -> MicroCore,然后选择 ATtiny13
  • 转到**"工具"**,然后选择以下主板选项:
    • **时钟:**1.2 MHz 内部振荡器
    • **董事会:**已禁用董事会
    • **定时:**微秒已禁用
  • 将您的编程器连接到您的PC和ATtiny。
  • 转到**"工具"->程序员**",然后选择您的 ISP 程序员(例如 USBasp)。
  • 转到工具 ->刻录引导加载程序以刻录保险丝。
  • 打开 TinyTacho.ino,然后单击上传

如果使用预编译的十六进制文件

  • 确保您已安装 avrdude
  • 将您的编程器连接到您的PC和ATtiny。
  • 打开终端。
  • 导航到包含十六进制文件的文件夹。
  • 执行以下命令(如有必要,请将"usbasp"替换为您使用的程序员):
avrdude -c usbasp -p t13 -U lfuse:w:0x2a:m -U hfuse:w:0xff:m -U flash:w:tinytacho.hex

如果使用生成文件(Linux/Mac)

  • 确保您已经安装了 avr-gcc 工具链和 avrdude
  • 将您的编程器连接到您的PC和ATtiny。
  • 打开 makefile 并更改程序员(如果您没有使用 usbasp)。
  • 打开终端。
  • 导航到包含生成文件和草图的文件夹。
  • 运行"进行安装"以编译,烧毁保险丝并上传固件。

性能

理论考虑

测量范围取决于:

  • 定时器/计数器的宽度(这里是 16 位)
  • 结果变量的宽度(此处为 16 位)
  • 定时器/计数器的时钟频率(CPU 时钟/预分频器,这里:1.2MHz / 64 = 18.75 kHz)

这导致测量范围为17 至 62500 RPM。为了增加测量范围,一方面必须通过降低预分频器和/或增加 CPU 时钟频率来增加定时器的时钟频率,另一方面必须将计数器和结果变量扩展到 32 位。此外,必须调整 OLED_printW 例程,以便可以在 OLED 上显示 32 位值。

测量分辨率

测量分辨率取决于定时器/计数器的分辨率,这实际上是它的时钟频率。由于计算公式,RPM值与计数器的值不成正比,而是相当夸张。这也意味着测量分辨率在整个测量范围内不是恒定的。定时器/计数器的时钟频率设置为18.75 kHz时,根据测得的转速,产生以下分辨率:
分辨率.png
所示图中的分辨率表示两个测量值之间的最小距离(值越高,分辨率越差)。为了提高分辨率,必须增加定时器/计数器的时钟频率(见上文)。为了不因此而减小测量范围,计数器和结果变量必须扩展到32位。

测量精度

测量精度主要取决于ATtiny内部RC振荡器的精度。根据数据手册,出厂校准时为**+/-10%。通过手动校准,可以将其提高到+/-2%。**为了获得更好的值,必须使用精确的外部时钟信号,但这超出了该项目的目的。对于较高的 RPM 值,还必须考虑中断服务例程的延迟。

实践回顾

合理性检查

可以使用视频方法以较低的速度执行简单的合理性检查。更多细节可以在Great Scott的视频中找到。此外,测量值可以与制造商针对测量 RPM 的电机规格进行比较。TinyTacho通过了这两项测试。

示波器

可以用示波器测量光电二极管阴极的电压行为。首先,在这里可以评估是否存在均匀、干净和无毛刺的波,从而是否可以合理地检测到经过的白色条纹。然后在示波器上测量的波频率自动指示每秒的转数。如果将此值乘以 60,您将得到 RPM,并且可以将其与 OLED 上显示的值进行比较。在所有测量中,该值均在理论预测精度范围内(未手动校准 ATtiny 的振荡器)。

范围1.png
范围2.png
范围3.png
设置.png

与商用设备比较

与廉价商用转速计DT-2234C+的测量值进行比较,显示出与示波器相同的结果。
商业.jpg

底线

即使TinyTacho更像是一个教育和有趣的项目,它也能提供合理的读数,特别是使用校准的振荡器。与商业产品相比,它要小得多,而且便宜得多。如果您可以不使用高分辨率的非常精确的测量值,那么TinyTacho是一种有用的测量仪器。

参考文献、链接和注释

  1. Great Scott's Tachometer
  2. ATtiny13 I²C OLED Tutorial
  3. SSD1306 Datasheet
  4. ATtiny13A Datasheet
  5. Calibrating ATtiny's Internal Oscillator

许可证

许可证.png

本作品采用知识共享署名-相同方式共享 3.0 未移植许可协议授权。(http://creativecommons.org/licenses/by-sa/3.0/)

BOM

暂无BOM

附件

序号文件名称下载次数
暂无数据
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航