ATtiny13 TinyTacho - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

标准版 ATtiny13 TinyTacho

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

开源协议: CC-BY-SA 3.0

(未经作者授权,禁止转载)

创建时间: 2022-02-28 10:12:10
更新时间: 2023-12-07 12:24:42
描述
# 概述 最近 Great Scott 制作了他的[DIY 版本的转速表](https://youtu.be/6QZMt4yyylU),我认为它非常酷。但是使用 ATmega 完成这项工作,我发现有点过于强大了。所以我试图将所有任务(测量、计算、I²C 协议和 OLED 显示)强制放入 ATtiny13 的 1KByte 巨大内存中。 * 固件(Github):[https ://github.com/wagiminator/ATtiny13-TinyTacho](https://github.com/wagiminator/ATtiny13-TinyTacho) * 项目视频(Youtube):[https ://youtu.be/Iz7LjheLYKo](https://youtu.be/Iz7LjheLYKo) ![pic1.jpg](https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyTacho/main/documentation/TinyTacho_pic1.jpg) # 硬件 由于ATtiny13几乎可以完成所有任务,因此布线非常简单:

![接线.png](https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyTacho/main/documentation/TinyTacho_Wiring.png) 红外LED发出光,该光被旋转物体反射并由红外光电二极管检测到。光电二极管根据反射光的强度改变其导电性。如果旋转物体在其他黑色表面上正好有一条白色条纹,则光电二极管每转改变其电阻两次,二极管和10k电阻之间的电压上升一次,并且下降一次低于某个阈值,该阈值由可变电阻定义。 ![pic2.jpg](https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyTacho/main/documentation/TinyTacho_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](https://github.com/wagiminator/attiny13-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 适配器](https://aliexpress.com/wholesale?SearchText=sop-8+150mil+adapter)进行焊接之前,或使用 [EEPROM 夹进行](https://aliexpress.com/wholesale?SearchText=sop8+eeprom+programming+clip)焊接后,必须对 ATtiny 进行编程。[AVR 编程器适配器](https://github.com/wagiminator/AVR-Programmer/tree/master/AVR_Programmer_Adapter)可以对此有所帮助。 ### 如果使用 Arduino IDE * 确保您已安装[微核](https://github.com/MCUdude/MicroCore)。 * 转到**工具 -> 板 -> MicroCore**,然后选择 **ATtiny13**。 * 转到**"工具"**,然后选择以下主板选项: * **时钟:**1.2 MHz 内部振荡器 * **董事会:**已禁用董事会 * **定时:**微秒已禁用 * 将您的编程器连接到您的PC和ATtiny。 * 转到**"工具"->程序员**",然后选择您的 ISP 程序员(例如 [USBasp](https://aliexpress.com/wholesale?SearchText=usbasp))。 * 转到**工具 ->刻录引导加载程序**以刻录保险丝。 * 打开 TinyTacho.ino,然后单击**上传**。 ### 如果使用预编译的十六进制文件 * 确保您已安装 [avrdude](https://learn.adafruit.com/usbtinyisp/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](http://maxembedded.com/2015/06/setting-up-avr-gcc-toolchain-on-linux-and-mac-os-x/)。 * 将您的编程器连接到您的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](https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyTacho/main/documentation/TinyTacho_resolution.png) 所示图中的分辨率表示**两个测量值之间的最小距离**(值越高,分辨率越差)。为了提高分辨率,必须增加定时器/计数器的时钟频率(见上文)。为了不因此而减小测量范围,计数器和结果变量必须扩展到32位。 ### 测量精度 测量精度主要取决于ATtiny内部RC振荡器的精度。根据数据手册,出厂校准时为**+/-10%。**通过[手动校准](https://github.com/wagiminator/ATtiny84-TinyCalibrator),可以将其提高到**+/-2%。**为了获得更好的值,必须使用精确的外部时钟信号,但这超出了该项目的目的。对于较高的 RPM 值,还必须考虑中断服务例程的延迟。 ## 实践回顾 ### 合理性检查 可以使用视频方法以较低的速度执行简单的合理性检查。更多细节可以在Great Scott的视频中找到。此外,测量值可以与制造商针对测量 RPM 的电机规格进行比较。TinyTacho通过了这两项测试。 ### 示波器 可以用示波器测量光电二极管阴极的电压行为。首先,在这里可以评估是否存在均匀、干净和无毛刺的波,从而是否可以合理地检测到经过的白色条纹。然后在示波器上测量的波频率自动指示每秒的转数。如果将此值乘以 60,您将得到 RPM,并且可以将其与 OLED 上显示的值进行比较。在所有测量中,该值均在理论预测精度范围内(未手动校准 ATtiny 的振荡器)。 ![范围1.png](https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyTacho/main/documentation/TinyTacho_scope1.png) ![范围2.png](https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyTacho/main/documentation/TinyTacho_scope2.png) ![范围3.png](https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyTacho/main/documentation/TinyTacho_scope3.png) ![设置.png](https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyTacho/main/documentation/TinyTacho_setup.png) ### 与商用设备比较 与廉价商用转速计[DT-2234C+](https://aliexpress.com/wholesale?SearchText=dt-2234C)的测量值进行比较,显示出与示波器相同的结果。 ![商业.jpg](https://raw.githubusercontent.com/wagiminator/ATtiny13-TinyTacho/main/documentation/TinyTacho_commercial.jpg) ## 底线 即使TinyTacho更像是一个教育和有趣的项目,它也能提供合理的读数,特别是使用校准的振荡器。与商业产品相比,它要小得多,而且便宜得多。如果您可以不使用高分辨率的非常精确的测量值,那么TinyTacho是一种有用的测量仪器。

# 参考文献、链接和注释 1. [Great Scott's Tachometer](https://youtu.be/6QZMt4yyylU) 2. [ATtiny13 I²C OLED Tutorial](https://github.com/wagiminator/attiny13-tinyoleddemo) 3. [SSD1306 Datasheet](https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf) 4. [ATtiny13A Datasheet](http://ww1.microchip.com/downloads/en/DeviceDoc/doc8126.pdf) 5. [Calibrating ATtiny's Internal Oscillator](https://github.com/wagiminator/ATtiny84-TinyCalibrator) # 许可证 ![许可证.png](https://i.creativecommons.org/l/by-sa/3.0/88x31.png)

本作品采用知识共享署名-相同方式共享 3.0 未移植许可协议授权。([http://creativecommons.org/licenses/by-sa/3.0/](http://creativecommons.org/licenses/by-sa/3.0/))
设计图
原理图
1 /
未生成预览图,请在编辑器重新保存一次
工程视频/附件
暂无
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP