possibility to read tacho signals with lower rpm
-
@cosmowave
It's obviously one for DC42, but I would think that it'd be pretty hard to get any sort of meaningful accuracy and resolution at those RPM's unless your fan gives multiple pulses per revolution.
If it's a single pulse you have less than one per second.
If you counted every 5 (60/12) seconds you'd get 2 Pulses @ 35rpm
Multiply by 12 gives a reading of 24rpm.
Likewise you'd get the same indicated reading at 60rpm and 70rpm. -
@cosmowave Such a slow RPM value can be seen as sign of live
Just read the tacho.signal every 5 sec in daemon.g and if it's >0 you're safe. -
-
This post is only for information and for closing this point!
The problem with my tacho signal is solved.
I have developed a signal multiplier/divider with a raspberry pi pico. The system is able to multiply or divide an incoming (tacho) signal with a factor between 1 and 15.
When i multiply my flowmeter tachosignal with factor 5, i'm allways in a range which RRF can read.If somebody has a similar problem, i'm happy to share my project.
-
@cosmowave always good to make something like that available
-
@cosmowave I'm glad that you found a solution.
RRF counts 16 tacho pulses, then divides the time in seconds over which those 16 pulses were counted by 30 * 16 to get the rpm. If 16 pulses are not received over 3 seconds then RRF assumes that the fan is not running.
To read as low 35 RPM we would need to extend that time from 3 seconds to about 16 seconds; but that would cause a 16-second delay after turning the fan off before the displayed rpm changes from its previous value to zero. I deemed 3 seconds to be as much as could be tolerated.
-
@dc42 I understand completely that you can't go lower with the allowed rpm.
For everybody who likes to rebuild the system a short description.
This was my very first project with a raspberry pico and the programming language Python (MicroPython). So i'm sure, my code is horrible! But it works at least on my breadboard.If someone can help me to change the sleep command in "def core_task():" (Line44) to a timer with interrupt, that would be great.
The pico was perfect because of the two cores. I use core0 to measure the incoming signal, core1 for generating the output signal. The Input is on GP20(pin26) with pullup. Output on GP21(pin27) with open collector.
When you switch GP1(pin2) to GND, the ouput signal will be divided (slower).
With switching GP2 - GP5 to GND you can "Bitwise" choose a multiply/divide factor betwee 1 to 15. (untested until now!)
If you switch nothing to GND, my default is set (multiply with factor 5).
The incoming signal doesn't need to be symetric, it switchs on the falling edge. The output is with 50% duty cycle.And here my first MicroPython code, written with the Thonny IDE. Eventually it is a bit chaotic. It tooks me two evenings for debugging until it was running without warning!
#----------------------------------# # File name: TachoMod.py # # Author: cosmowave # # Date created: 6.9.2022 # # Date last modified: 10.9.2022 # # Version 1.4 # #----------------------------------# # imports from machine import Pin import time import _thread # variable definition global Multiply # variable for multiply or divide Multiply = True global Factor # factor for multiply/divide Factor = 0 global TachoInPeriod # time of the incoming tachosignal period in ms global TachoOutPeriod # time of the outgoing tachosignal period in ms global FirstReading # true when first reading of the falling edge is needed (timer start) FirstReading = True global OutputEnable # enables the outgoing tachosignal OutputEnable = False global start # start of timer global RunCore1 # flag if core1 is already running RunCore1 = False # ----core1 task (calculate and generate outgoing tachosignal when activated trough core0)---- # read OutputEnable, calculate TachoOutPeriod, generate tacho output def core_task(): global TachoOutPeriod global RunCore1 global Multiply global TachoInPeriod global Factor while OutputEnable == True: # output on? if Multiply == True: # multiply (faster output signal) TachoOutPeriod = int(TachoInPeriod / Factor) else: # divide (slower output signal) TachoOutPeriod = int(TachoInPeiod * Factor) OutTachoDuet.toggle() # toggle tacho output time.sleep_ms(int(TachoOutPeriod / 2)) # wait a "half period" to toggle output again RunCore1 = False _thread.exit() # shut off core1 OutTachoDuet=Pin(21, Pin.OPEN_DRAIN, value=1) # tachosignal output (open drain) for DUET # ----core0 task (input reading, measuring incoming tachosignal)---- # interrupt handler at falling edge of tacho input, measures tacho input, sets OutputEnable, starts/stops core1 def InTacho_readTask(pin): # interrupt from tacho input global start global FirstReading global OutputEnable global RunCore1 global TachoInPeriod if FirstReading == True: # first falling edge? start = time.ticks_ms() # get millisecond counter FirstReading = False else: TachoInPeriod = time.ticks_diff(time.ticks_ms(), start) # compute time difference between falling edges start = time.ticks_ms() # start a new timer OutputEnable = True # activate tacho output if RunCore1 == False: # core1 already running? RunCore1 = True _thread.start_new_thread((core_task),()) # start core1 InTachoFlowmeter=Pin(20, Pin.IN, Pin.PULL_UP) # flowmeter tachosignal, with pullup(switch to GND) InTachoFlowmeter.irq(trigger=Pin.IRQ_FALLING, handler=InTacho_readTask) # interrupt on falling edge #----main task---- # read multiply/divide input global Multiply global Factor InMultiDiv=Pin(1, Pin.IN, Pin.PULL_DOWN) # multiply/divide input, with pulldown(switch to VCC) if InMultiDiv.value() == 0: Multiply = True # multiply else: Multiply = False # divide # read factor inputs InFactorBit0=Pin(2, Pin.IN, Pin.PULL_DOWN) # factor bit0 input, with pulldown(switch to VCC) InFactorBit1=Pin(3, Pin.IN, Pin.PULL_DOWN) # factor bit1 input, with pulldown(switch to VCC) InFactorBit2=Pin(4, Pin.IN, Pin.PULL_DOWN) # factor bit2 input, with pulldown(switch to VCC) InFactorBit3=Pin(5, Pin.IN, Pin.PULL_DOWN) # factor bit3 input, with pulldown(switch to VCC) if InFactorBit0.value() == 1: Factor = 1 if InFactorBit1.value() == 1: Factor = (Factor + 2) if InFactorBit2.value() == 1: Factor = (Factor + 4) if InFactorBit3.value == 1: Factor = (Factor + 8) if Factor == 0: # no factor bit setted -> set to default = 5 Factor = 5 #----Main loop---- # check if no tacho input since 3seconds to switch off output while True: global start global OutputEnable global FirstReading while OutputEnable == True: if time.ticks_diff(time.ticks_ms(), start) > 3000: # more than 3000ms without tacho input OutputEnable = False # shut off output (core1) FirstReading = True # allow next "first reading"
-
This post is just for info:
I have expanded this "TachoMod" project a bit.
Actual version is V4.0 with the following additional functions:- Raspberry Pico has now a small OLED-Display (with 2 buttons) for displaying datas and enabling a menu
- Tacho-signal period and rpm of in-/output is displayed
- Menu for changing multiply/divide mode, factor, timeout, pulse per revolution
- stores all settings on onboard memory
If someone is interessed, i can share the source code and additional infos...
-
@cosmowave said in possibility to read tacho signals with lower rpm:
If someone is interessed, i can share the source code and additional infos...
Always!
-
On the hardware side i've used following parts:
- a Raspberry Pi Pico
- Waveshare 1.3 inch OLED, https://www.waveshare.com/wiki/Pico-OLED-1.3
- two small diodes (1N4148)
Optional parts for the housing:
- housing, PicoGehäuse.STL
- TPU front cover, DeckelFolie4.STL
- TPU cable outlet, KabeldurchfPicoAssy.STL
Sorry, the photo is not very sharp! And i know, the "S" on the TPU front cover is "upside down"...The wiring remains like in my post from 13.9.22 except that i have inserted the 2 diodes in the signal lines. Also there is no need to set the "input bits" because we have a menu for changing the settings.
The TachoMod starts automatically when an input signal is detected. After start, it shows the period duration and the rpm of the incoming(top) and outgoing signals(bottom). see photo above
With the "S" button you can enter the menu (only possible when no input signals are detected), the "+" button increments values in the menu.
The following settings are implemented:- Multiply/Divide Mode: “/” or “x” ; Makes output faster or slower compared to input signal
- Factor (multiply or divide): 1-16
- Delay time: 1-9999ms ; after which time without inputsignal the output will be switched off
- Pulse per revolution: 1-16 (normally 2) ; for calculating the correct rpm values
All settings will be stored automatically to onboard flash memory after leaving the menu.
And here is the source code of TachoMod_V4.0, written in microPython with ThonnyIDE.
TachoMod_V4_0.py
The code will be far away from "perfect", but it works.
And it was a really nice project for my first steps with a Raspberry Pico and the programming language Python.I hope this description is more or less understandable and sorry for my bad english...
-