Hallo, ich habe einen Windgeschwindigkeitsmesser, die Spannung wird einfach mit einem Reed-Relais geschaltet. 0-100Hz 0 bis 40m/s und ich will die Frequenz messen. Kann ich es direkt an µC anschließen, dass es einfach 5V mit Reed geschalten wird? gruß Mischa
Gast
#2195011
Jo, was spricht dagegen? Steht was gegenteiliges in den Datenblättern des µC oder des Reed-Relais?
@Helfer eigentlich nichts. Nachdem ich verusucht hatte mittels timer/interrupt je 1sekunde die Anzahl der Impulse zu messen. Habe ich dieses Code gefunden. Kann mir da jemand helfen, wie ich das ganze in Sekunden umrechnen kann? gruß
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
Gast
#2195210
Die Umrechnungan scheitert daran, dass man nicht weiss, wie schnell dein AVR getaktet wird. Du kannst dir die Umrechnung fürs erste auch schenken und mal counts also quasi die Rohdaten als solche anzeigen lassen. Ändert sich counts sinnvoll mit der Geschwindigkeit des Windmessers?
Gast
#2195219
Wenn du eine sinnvolle Anzeige von counts bekommst: Du hast F_CPU Takte pro Sekunde, also entsprechen laut Dreisatz counts Takte t Sekunden... Damit kannst du t und damit auch die Frequenz f = 1/t und damit auch die Windgeschwindigkeit ausrechnen. Wenn du keine sinnvolle Anzeige von counts bekommst: Das Thema Entprellung ist auch bei Reed-Relais aktuell.
Gast
#2195223
Der Code ist im übrigen nicht besonders gut geschrieben. Du solltest unbedingt die Grundlagen des Artikels Interrupt bzgl. volatile und atomarem Zugriff im Code ergänzen.
Super, danke für die schnelle Antowort. der Atmega328p ist mit 16 MHz getaktet. Was genau meint Ihr mit unsauberer Programmierung, z.B. dass zu viele Anweisungen in Interrupt ausgeführt werden? gruß Mischa
Gast
#2195618
Nö, dazu kann ich noch nix sagen, weil noch kein fetter Code in den ISRs steht. Grundsätzlich hast du aber mit dem Ziel knappen Code in der ISR zu schreiben Recht. Die Stelle /*you can convert coutns to seconds and send to LCD*/ musst du ja nicht mit lahmem Code füllen, sondern du kannst (und solltest) die Aufbereitung und die Ausgabe im Programmteil ausserhab der ISRs machen. Ich meinte besonders: >> Du solltest unbedingt die Grundlagen des Artikels Interrupt >> bzgl. volatile und atomarem Zugriff im Code ergänzen. counts solltest du volatile machen. Und wenn du auf counts im Hauptprogramm zugreifst, muss du den Zugriff atomar kapseln, d.h. während des Lesezugriffs die Interrupts kurz sperren. Kurz heisst daher Interrupts sperren, Lesen und Kopie anlegen, Interrupts freigeben dann mit Kopie weiterarbeiten. Ein nicht volatiles ov_counter könnte funktionieren, da die Variablen nur innerhalb der ISRs benutzt wird und die selber nicht von Interrupts unterbrochen werden. Schön ist diese Variante aber nicht. ov_counter würde ich auch volatile machen.
Gast
#2195637
Bei deiner Formel für counts stimmt IMHO was nicht:
>> counts=(uint32_t)falling-(uint32_t)rising+(uint32_t)ov_counter;
Ich würde benutzen:
counts = 65536UL * ov_counter + falling - rising;
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.