
ATtiny13 TinyTacho
简介
简易转速表(RPM-Meter)
简介:简易转速表(RPM-Meter)开源协议
:CC-BY-SA 3.0
描述
概述
最近 Great Scott 制作了他的DIY 版本的转速表,我认为它非常酷。但是使用 ATmega 完成这项工作,我发现有点过于强大了。所以我试图将所有任务(测量、计算、I²C 协议和 OLED 显示)强制放入 ATtiny13 的 1KByte 巨大内存中。
- 固件(Github):https ://github.com/wagiminator/ATtiny13-TinyTacho
- 项目视频(Youtube):https ://youtu.be/Iz7LjheLYKo
硬件
由于ATtiny13几乎可以完成所有任务,因此布线非常简单:
红外LED发出光,该光被旋转物体反射并由红外光电二极管检测到。光电二极管根据反射光的强度改变其导电性。如果旋转物体在其他黑色表面上正好有一条白色条纹,则光电二极管每转改变其电阻两次,二极管和10k电阻之间的电压上升一次,并且下降一次低于某个阈值,该阈值由可变电阻定义。
如果您想使用纽扣电池为设备供电,请记住,只有可充电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时,根据测得的转速,产生以下分辨率:
所示图中的分辨率表示两个测量值之间的最小距离(值越高,分辨率越差)。为了提高分辨率,必须增加定时器/计数器的时钟频率(见上文)。为了不因此而减小测量范围,计数器和结果变量必须扩展到32位。
测量精度
测量精度主要取决于ATtiny内部RC振荡器的精度。根据数据手册,出厂校准时为**+/-10%。通过手动校准,可以将其提高到+/-2%。**为了获得更好的值,必须使用精确的外部时钟信号,但这超出了该项目的目的。对于较高的 RPM 值,还必须考虑中断服务例程的延迟。
实践回顾
合理性检查
可以使用视频方法以较低的速度执行简单的合理性检查。更多细节可以在Great Scott的视频中找到。此外,测量值可以与制造商针对测量 RPM 的电机规格进行比较。TinyTacho通过了这两项测试。
示波器
可以用示波器测量光电二极管阴极的电压行为。首先,在这里可以评估是否存在均匀、干净和无毛刺的波,从而是否可以合理地检测到经过的白色条纹。然后在示波器上测量的波频率自动指示每秒的转数。如果将此值乘以 60,您将得到 RPM,并且可以将其与 OLED 上显示的值进行比较。在所有测量中,该值均在理论预测精度范围内(未手动校准 ATtiny 的振荡器)。
与商用设备比较
与廉价商用转速计DT-2234C+的测量值进行比较,显示出与示波器相同的结果。
底线
即使TinyTacho更像是一个教育和有趣的项目,它也能提供合理的读数,特别是使用校准的振荡器。与商业产品相比,它要小得多,而且便宜得多。如果您可以不使用高分辨率的非常精确的测量值,那么TinyTacho是一种有用的测量仪器。
参考文献、链接和注释
- Great Scott's Tachometer
- ATtiny13 I²C OLED Tutorial
- SSD1306 Datasheet
- ATtiny13A Datasheet
- Calibrating ATtiny's Internal Oscillator
许可证
本作品采用知识共享署名-相同方式共享 3.0 未移植许可协议授权。(http://creativecommons.org/licenses/by-sa/3.0/)
设计图
BOM


评论