Beim AD-Wandeln kommen doch normalerweise 10-Bit raus. Dein "sub" is aber doch nur ein Byte. das gibt doch Streß mit dem Vorzeichen ?
Hallo,
habe ein kleines Programm geschrieben um einen DC-Motor der belastet wird etwas mehr Saft per PWM zu geben damit dieser in der Drehzahl nicht so stark abfällt.
Leider funktioniert das irgendwie nicht. Ich messe Jeweils die Spannung an der Stromquelle und einmal direkt am Motor so das das Kabel als Shunt fungiert. Es entsteht auch eine messbare Differenz dieser beiden Signale. Wie nutze ich diese aber um meine PWM-Rate zu erhöhen. Ich habe mal das Programm etwas vereinfacht dargestellt und einige Teile die funktionieren weggelassen.
main:
rcall ADWandlung1.....;Ergebniss in temp
rcall ADWandlung2.....;Ergebniss in temp2
sub temp, temp2....... ;Differenz steht in temp
out portc, temp......... ;Zur Kontroll eausgabe am PortC
ldi temp3,126............ ;Schwellwert
cp temp, temp3......... ;Vergleiche temp mit Schwellwert
brge hochsetzen....... ;wenn temp gleich oder größer temp3 gehe zu Routine die PWM-Wert erhöht
rjmp main
hochsetzen:
ldi pwm, 120
rcall PWMübergabe....;Übergebe 120 an PWM-Einheit um Drehzahlverlust auszugleichen, normalwert ist 60
rjmp main
Edit: Im AVR-Studio kann ich das simulieren lassen und es funktioniert auch das die Hochsetzroutine angesprungen wird wenn die Differenz höher ist. Wenn ich im Programm den Wert von 126 auf 128 ändere dreht sich der Motor auch schneller. Wenns aber auf 126 steht und ich ihn abbremse passiert ncihts obwohl ich am PortC sehe das die dDifferenz höher wird.
Beim AD-Wandeln kommen doch normalerweise 10-Bit raus. Dein "sub" is aber doch nur ein Byte. das gibt doch Streß mit dem Vorzeichen ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Du könntest die Werte nach 16 Bit expandieren zum Vergleich:
temp= r25:r24
temp2= r19:r18
r0=0
Code:clr r0 lds r24, temp clr r25 lds r18, temp2 sub r24, r18 sbc r25, r0 cpi r24, 126 cpc r25, r0 brlt 0f ; temp-temp2 >= 126 0:
Disclaimer: none. Sue me.
ich habe das ADLAR Bit gesezt so das ich die oberen 8Bit des 10Bit-ADC-Ergebniss in ADCH habe. Ich arbeite also nur mit 8 Bits.
Nein, tust du nicht. Bei der Subtraktion kann ein Übertrag auftreten. Du brauchst also 9 Bit. Oder kannst du sicherstellen, daß in ADCH nur Werte von 0..127 stehen?
Disclaimer: none. Sue me.
Signal A ist größer als Signal B
dann dürfte doch bei sub Signal A, Signal B kein Übertrag auftreten.
Ist das der Fall wenn Signal B größer als A ist das es dann so rausläuft
128-140= -12 also 12 plus gesetzes Negativ-Flag?
nein, -12 (0x0C) => 0xF4
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Bist du sicher, daß A immer größer ist als B. Nicht in der Theorie, sondern in der Praxis (Rauschen, etc.) Und ein Vergleich wie oben ist doch net so kompliziert, oder sind die Handvoll asm-Instruktionen schon zu viel?
Disclaimer: none. Sue me.
Lesezeichen