PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Mit PWM die Spannung halbieren?



pin117
18.04.2012, 06:19
Ich habe am rn-control ein RN-VN2 angeschlossen und beide Boards werden mit einer (Bleiakku) Spannung von ~12v betrieben. Die zu steuernden Motoren vertragen allerdings nur 6V und ich rätsel jetzt, wie ich die Spannung softwareseitig mit BASCOM runter bekommen kann (oder macht man sowas mit der Hardware)?

http://www.rn-wissen.de/index.php/Pwm und http://www.rn-wissen.de/index.php/Bascom_und_PWM habe ich gesehen, aber hat mir nicht wirklich geholfen bei dem Punkt.

Timer1 setze ich derzeit so:


Config TIMER1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
...
TCCR1B = TCCR1B Or &H02 'in einem Beispielsource mal gesehen und blind versucht bzw. alternativ->
Tccr1a = &B10100010
Tccr1b = &B10000010

Versucht habe ich auch noch Prescale 8 oder 1, aber egal was ich ändere, die Spannung der Motoren (mit Voltmeter gemessen) ändert sich nur zu wenig - egal ob

Pwm1a= 10
Pwm1a= 1000

Blickt da jemand besser durch als ich?

pin117
18.04.2012, 07:17
Hinweis: Bei der Netzteilspannung sollte man beachten, das auch die Motoren die volle Spannung vertragen.
Verträgt Ihr Motor beispielsweise nur 6V, so kann zwar auch ein 12V Netzteil verwendet werden, jedoch muss
man dann beim Ansteuern darauf achten das man „nie Vollgas gibt“, also das PWM-Signal entsprechende
programmiert. Dies ist im übrigen recht einfach!

...habe ich gerade gelesen und ja es stimmt, wenn man es weiss ist alles einfach, nur wie.

Wie gesagt, selbst bei 10 PWM spuckt mir das Messgerät am Motorport noch 12.xV aus

021aet04
18.04.2012, 07:50
Mit was hast du gemessen? Ich müsste im DB schauen was für ein Bit was macht. Das ist sehr unübersichtlich (vielleicht liegt es auch an Bascom, ich arbeite mit AVR Studio). Wenn du mit einem Oszi misst ist es klar das du die 12V misst. Die Spitzenspannun bleibt immer gleich. Der Unterschied ist der Mittelwert. Wenn du 12V hast und eine PWM von 50% hast (50% ein, 50% aus) hast du im Schnitt 50% von 12V, das sind 6V.

Wenn du ein normales Multimeter hast solltest du, wenn die PWM Frequenz hoch genug ist eine Spannung messen die dem PWM entspricht (bei 50% also 6V). Du musst Gleichspannung messen.

MfG Hannes

pin117
18.04.2012, 08:02
Gemessen mit normalem Voltmeter (Voltcraft VC170) und Gleichspannung.

Bei einem PWM 0 ist die Spannung am Motor Anschluss identisch zur Eingangsspannung des RN-VN2 am Motorenport.
Bei PWM 25 geht sie 0,05V hoch ?!?

021aet04
18.04.2012, 08:05
Es gibt 2 Möglichkeiten. Entweder ist die Einstellung falsch (mit Bascom kenne ich mich nicht aus da ich mit AVR Studio programmiere) oder das Messgerät misst falsch.

MfG Hannes

pin117
18.04.2012, 08:09
Wenn die Motoren dranhängen sind sie auch deutlich zu schnell und zum Glück hällt das Metallgetriebe es kurzzeitig aus, bis ich den Schalter erwischen kann.

Was meinst Du mit falsch eingestellt?

PS: Verbunden sind
RN-Control [PortC PIN 7] (PC6) mit dem RN-VN2 [PIN 2] - Motor 1 IN 1
RN-Control [PortC PIN 8] (PC7) mit dem RN-VN2 [PIN 1] - Motor 1 IN 2

RN-Control [PortB PIN 1] (PB0) mit dem RN-VN2 [PIN 3] - Motor 2 IN 1
RN-Control [PortB PIN 2] (PB1) mit dem RN-VN2 [PIN 4] - Motor 2 IN 2

RN-Control [PortD PIN 5] (PD4) mit dem RN-VN2 [PIN 6] - PWM Motor 1
RN-Control [PortD PIN 6] (PD5) mit dem RN-VN2 [PIN 8] - PWM Motor 2

Am RN-Control und am RN-VN2 liegen jeweils 12V vom Labornetzteil und PORTC 5V/GND auf RN-VN2

Ich habe die BASCOM Testdatei "mcontroltestmega32.BAS" unverändert von der CD geladen.


'################################################# ##
'rncontroltest.BAS
'für
'RoboterNetz Board RN-CONTROL ab Version 1.1
'Das neue preiswerte Controllerboard zum experimentieren
'
'Aufgabe:
' Dieses testprogramm testet gleich mehrere Eigenschaften auf dem Board
' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
' Taste 1: Zeigt Batteriespannung über RS232 an
' Taste 2: Angeschlossene Motoren beschleunigen und abbremsen
' Taste 3: Einige male Lauflicht über LED´s anzeigen. Am I2C-Bus
' darf in diesem Moment nichts angeschlossen sein
' Taste 4: Zeigt analoge Messwerte an allen Port A PIN´s über RS232 an
''Taste 5: Zeigt digitalen I/O Zustand von PA0 bis PA5 an


' Ser gut kann man aus dem Demo auch entnehmen wie Sound ausgegeben wird,
' wie Tasten abgefragt werden und wie Subroutinen und Funktionen angelegt werden

'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de oder robotikhardware.de
'################################################# ######


Declare Sub Batteriespannung()
Declare Sub Motortest()
Declare Sub Lauflicht()
Declare Sub Showporta()
Declare Sub Showdigitalporta()
Declare Function Tastenabfrage() As Byte


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32


Dim I As Integer
Dim N As Integer
Dim Ton As Integer

$crystal = 16000000 'Quarzfrequenz
$baud = 9600

Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung

Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein


Const Ref = 5 / 1023 'Für Batteriespannungsberechnung

Dim Taste As Byte
Dim Volt As Single

' Für Motorentest
'Ports für linken Motor
Config Pinc.6 = Output 'Linker Motor Kanal 1
Config Pinc.7 = Output 'Linker Motor Kanal 2
Config Pind.4 = Output 'Linker Motor PWM
'Ports für rechten Motor
Config Pinb.0 = Output 'Rechter Motor Kanal 1
Config Pinb.1 = Output 'Rechter Motor Kanal 2
Config Pind.5 = Output 'Rechter Motor PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02 'Prescaler = 8





I = 0
Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450 'BEEP
Print
Print "**** RN-CONTROL 1.4 *****"
Print "Das neue Experimentier- und Roboterboard"
Print "Weitere passende Zusatzboards bei www.robotikhardware.de"
Print
Do




Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
Call Batteriespannung 'Taste 1 Zeigt Bateriespannung über RS232 an
Case 2
Call Motortest 'Taste 2 Motoren beschleunigen und abbremsen
Case 3
Call Lauflicht 'Einige male Lauflicht über LED´s anzeigen. Am I2C-Port darf in diesem Moment nichts angeschlossen sein
Case 4
Call Showporta 'Zeigt Messwerte an allen Port A PIN´s
Case 5
Call Showdigitalporta 'Zeigt digitalen I/O Zustand von PA0 bis PA5 an



End Select
Sound Portd.7 , 400 , 500 'BEEP
End If

Waitms 100
Loop

End




'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Local Ws As Word

Tastenabfrage = 0
Ton = 600
Start Adc
Ws = Getadc(7)
' Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
If Ws < 500 Then
Select Case Ws
Case 400 To 450
Tastenabfrage = 1
Ton = 550
Case 330 To 380
Tastenabfrage = 2
Ton = 500
Case 260 To 305
Tastenabfrage = 3
Ton = 450
Case 180 To 220
Tastenabfrage = 4
Ton = 400
Case 90 To 130
Tastenabfrage = 5
Ton = 350
' Case Else
' Print "Tastenabfrage anpassen!ADC Wert ws=" ; Ws
End Select
Sound Portd.7 , 400 , Ton 'BEEP

End If

' If Ws < 1023 Then
' Select Case Ws
' Case 895 To 910
' Tastenabfrage = 1
' Ton = 550
' Case 870 To 894
' Tastenabfrage = 2
' Ton = 500
' Case 650 To 690
' Tastenabfrage = 3
' Ton = 450
' Case 450 To 480
' Tastenabfrage = 4
' Ton = 400
' Case 220 To 280
' Tastenabfrage = 5
' Ton = 350
' End Select
' Sound Portd.7 , 400 , Ton 'BEEP
' End If

End Function



'Diese Unterfunktion zeigt Batteriespannung an
Sub Batteriespannung()
Local W As Word
Start Adc
W = Getadc(6)
Volt = W * Ref
Volt = Volt * 5.2941
Print "Die aktuelle Spannung beträgt: " ; Volt ; " Volt"

End Sub


'Testet Motoren und Geschwindigkeitsreglung
Sub Motortest()
'Linker Motor ein
Portc.6 = 1 'bestimmt Richtung
Portc.7 = 0 'bestimmt Richtung
Portd.4 = 1 'Linker Motor EIN

'Rechter Motor ein
Portb.0 = 1 'bestimmt Richtung rechter Motor
Portb.1 = 0 'bestimmt Richtung rechter Motor
Portd.5 = 1 'rechter Motor EIN


I = 0
Do
Pwm1a = I
Pwm1b = I
Waitms 40
I = I + 5
Loop Until I > 1023

Wait 1
Do
Pwm1a = I
Pwm1b = I
Waitms 40
I = I - 5
Loop Until I < 1
Pwm1a = 0 'Linker Motor aus
Pwm1b = 0 'rechter Motor aus
End Sub


'Einige male Lauflicht über LED´s anzeigen. Am I2C-Port darf in diesem Moment nichts angeschlossen sein
Sub Lauflicht()

Config Portc = Output
Portd = 0
For N = 1 To 10
For I = 0 To 7
Portc.i = 0
Waitms 100
Portc.i = 1
Next I
Next N
Config Portc = Input
End Sub


'Zeigt Die Analogen Messwerte An Port A An
Sub Showporta()
Local Ws As Word

Config Porta = Input
For I = 0 To 5 ' Alle internen Pullup Widerständ ein,bis auf Batteriespannungsmessungsport
Porta.i = 1
Next I

Print
Print "Ermittelte Messwerte an Port A:"
For I = 0 To 7 ' Alle Eingäne inkl.messen
Start Adc
Ws = Getadc(i)
Volt = Ws * Ref
Print "Pin " ; I ; " ADC-Wert= " ; Ws ; " bei 5V REF waeren das " ; Volt ; " Volt"
Next I
End Sub


'Zeigt den Zustand einiger freier I/O von Die Analogen Messwerte An Port A An
Sub Showdigitalporta()
Local Zustand As String * 6
Config Porta = Input
For I = 0 To 5 ' Alle internen Pullup Widerständ ein,bis auf Batteriespannungsmessungsport
Porta.i = 1
Next I

Print
Print "Ermittelter I/O Zustand Port A:"
For I = 0 To 5 ' Alle Eingäne inkl.messen
If Pina.i = 1 Then
Zustand = "High"
Else
Zustand = "Low"
End If
Print "Pin " ; I ; " I/O Zustand= " ; Pina.i ; " " ; Zustand
Next I
End Sub


Ergebnis nach dem Drücken des Tasters 2 geht die Spannung (gemessen mit Voltmeter auf Motor1) bis 12,34V hoch und wieder runter bis sie auf 12,08V bleibt. 12,08V ist bei dem Test auch die Spannung an beiden Platinen.

Der L293D vom rn-control ist entfernt.

Fusebits: http://img16.imageshack.us/img16/5749/fuseru.jpg

Aber irgendetwas stimmt da nicht.

Kampi
18.04.2012, 12:02
Ich steige da jetzt nicht so ganz durch ;)
Kannst du mal deinen Aufbau posten + den Code den du verwendest (beides so wie du es hattest und wo es nicht funktioniert hat).
Ansonsten betreib mal das RN-Control alleine und verwende dieses Programm hier:




' Hardware PWM mit Timer1

$regfile = "m32def.dat"
$crystal = 16000000
Config Portd.4 = Output
Config Portd.5 = Output Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Do

Compare1a = 127

Loop
End



Nun solltest du an Compare1A (D5) eine Spannung von 2,5V haben. Wenn das funktioniert setzt du mal die Motortreiber ein, legst Spannung an das RN-VN2 und aktivierst den Motortreiber (bei dem Motortreiber musst du ja einen von zwei Anschlüssen auf High setzen und eine PWM anlegen damit sich der Motor dreht). Nun solltest du eine Spannung von 6V an einem der Motoranschlüsse messen.

pin117
18.04.2012, 15:03
Ja, wenn ich das RN-VN2 abklemme bzw. alle Erweiterungen und Deinen Source einspiele, sind auf dem D5 2,5Volt.

Wenn ich dann das VN2 dranhänge und den Code wie folgt ändere:


' Hardware PWM mit Timer1

$regfile = "m32def.dat"
$crystal = 16000000
Config Portd.4 = Output
Config Portd.5 = Output Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Config PINB.0 = Output
Config PINB.1 = Output
PORTB.0 = 0
PORTB.1 = 1

Do

Compare1a = 127

Loop
End

Steht der Motor 2 auf 12 Volt

RN-Control [PortD PIN 6] (PD5) <-> RN-VN2 [PIN 8] - PWM Motor 2 = 2,5V
RN-Control [PortB PIN 2] (PB1) <-> RN-VN2 [PIN 4] - Motor 2 IN 2 = 5V
RN-Control [PortB PIN 1] (PB0) <-> RN-VN2 [PIN 3] - Motor 2 IN 1 = 0V

Ist das VN2 hinüber?

Kampi
18.04.2012, 15:15
Hast du mal gemessen ob die Logikpegel stimmen?

pin117
18.04.2012, 15:19
Warum steht das dann in der Testdatei "mcontroltestmega32.BAS" von der CD???


'Ports für rechten Motor
Config Pinb.0 = Output 'Rechter Motor Kanal 1
Config Pinb.1 = Output 'Rechter Motor Kanal 2
Config Pind.5 = Output 'Rechter Motor PWM

Zum messen der Logikpegel müsst ich wissen wie (nie gemacht) und frag mich, ob mein Messgerät sowas kann? Viel mehr hab ich hier nicht zum Messen. Oder meinst Du ob PB1 5V hat? Ja, wie oben beschrieben.

Ich versuch mal andere Ports als PB0 und PB1 bzw. welche wären besser?

pin117
18.04.2012, 17:09
Leider immer das selbe Ergebnis. Ich werde noch wahnsinnig...

Wenn ich jetzt Compare1a = 0 teste, bekomme ich am Motor immernoch 11,76v bei 12,08v Hauptspannung am VN2



$regfile = "m32def.dat"
$crystal = 16000000
Config Portd.4 = Output
Config Portd.5 = Output Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Config PINB.0 = Output
Config PINB.1 = Output
PORTB.0 = 0
PORTB.1 = 1

Do

Compare1a = 0

Loop
End

021aet04
19.04.2012, 07:36
Kannst du einmal genau posten wie du die Schaltung verbunden hast (Plan vom tatsächlichen Aufbau). Miss die Spannungen und trage sie im Plan ein wo und wie du gemessen hast (wo ist die rote und wo ist die Schwarze Leitung).

MfG Hannes

pin117
19.04.2012, 12:03
Hier die Bilder mit Messdaten dazu:

Grundschaltung RN-Control <-> RN-VN2 http://www.bilder-space.de/show_img.php?img=8b46d0-1334833093.jpg&size=original

PWM-Messung http://www.bilder-space.de/show_img.php?img=5ac414-1334833197.jpg&size=original

Motor-Ports am RN-VN2 http://www.bilder-space.de/show_img.php?img=8804cf-1334833254.jpg&size=original

Ergebnis am Motor2 Anschluss http://www.bilder-space.de/show_img.php?img=fa99fd-1334833324.jpg&size=original

Verwendetes Programm im RN-Control


$programmer = 12
$regfile = "m32def.dat"
$crystal = 16000000
Config Portd.4 = Output
Config Portd.5 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Config PINB.0 = Output
Config PINB.1 = Output
PORTB.0 = 0
PORTB.1 = 1

Do

Compare1a = 127

Loop
End


Ich hatte das Board an einem alten RN-Control angeschlossen, als das rn-control unachtsamerweise mal auf den Bleiakku (12v) gefallen ist und dabei zerstört wurde.
Daher meine Vermutung, dass das RN-NV2 vielleicht auch einen "Schlag" abbekommen hat und jetzt fehlerhaft ist?

MagicWSmoke
19.04.2012, 18:03
Was soll denn das hier ?
https://www.roboternetz.de/community/threads/57597-RN-VN2-Problem
Du hast hier doch einen Thread, nur weil Du Deine Fehler noch nicht kennst, kannst Du nicht von anderen Fehlern ausgehen.

Das abgebildete Multimeter ist nicht in der Lage eine PWM mit 62,5kHz zu messen und eine PWM verringert auch keine Spannung, sondern die abgegebene Leistung.
Die Spannung bleibt immer gleich und entspricht der Eingangsspannung, außer in einer Position bei 0 oder 255, je nach Clear Up oder Down, dann ist sie 0.

Welche Bascom-Version wird verwendet ? Es gab eine Änderung in 2.0.7.1, bei der die Bezeichner Clear Up/Down den Atmel Datenblättern angepasst wurde.
Um die Logik umzukehren im Config Timer die Clear Up gegen Clear Down tauschen und dann nochmal versuchen.

pin117
19.04.2012, 18:17
Oh man, da fällt es wie Schuppen von den Augen....

Du hast natürlich vollkommen recht und seit ich mit der Beispieldatei von der CD-Rom den Fehler hatte, habe ich nur noch Volt gemessen - was nicht geht, wie Du trefflich sagst. Jetzt habe ich die Motoren angeschlossen und natürlich geht es mit denen. Sowohl Compare1a = 127 also auch z.B. 50 langsamer.

Die Version von BASCOM bei mir ist die 2.0.7.1. Sollte ich Clear Up besser tauschen? Jetzt scheint es trotzdem derzeit zu gehen?

MagicWSmoke
19.04.2012, 18:24
also auch z.B. 50 langsamer.
Wenn 50 langsamer als 127 ist, dann ist die Konfiguration ok und Du musst hier nichts ändern:

Die Version von BASCOM bei mir ist die 2.0.7.1. Sollte ich Clear Up besser tauschen?
Machst Du's trotzdem, kehren sich die erforderlichen Werte für die Compare-Register um.

pin117
19.04.2012, 18:26
verstehe, danke

you made my day ;)

pin117
19.04.2012, 20:57
Ich stehe natürlich gleich vor dem nächsten Problem...

Jeder Motor lässt sich einzeln ansteuern, aber nicht beide zusammen. Warum?



$programmer = 12
$regfile = "m32def.dat"
$crystal = 16000000
Config Portd.4 = Output 'PWM Motor 1
Config Portd.5 = Output 'PWM Motor 2
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Config PINB.0 = Output ' Motor 1 in 1
Config PINB.1 = Output ' Motor 1 in 2
Config PINC.6 = Output ' Motor 2 in 1
Config PINC.7 = Output ' Motor 2 in 2

PORTB.0 = 1 ' Richtung vor
PORTB.1 = 0 ' Richtung zurück

PORTC.6 = 1
PORTC.7 = 0
PORTD.5 = 1

' GEHT
Pwm1a = 127
Pwm1b = 0
Waitms 400

'GEHT
Pwm1a = 0
Pwm1b = 127
Waitms 400

' GEHT NICHT wenn beide an sind???
Pwm1a = 127
Pwm1b = 127
Waitms 400

'GEHT natürich
Pwm1a = 0
Pwm1b = 0

End

pin117
19.04.2012, 21:11
Nach stundenlanger Suche hab ich's natürlich rausgefunden kurz nachdem ich hier im Forum wieder gefragt habe...

Der Prescaler muss auf 8, dann gehen beide.

Ich hab zwar nicht verstanden, was der Prescaler macht (die Dokumentation an der Stelle leuchtet mir noch nicht ein). Aber falls mal jemand das Selbe Problem hat...

Thomas E.
19.04.2012, 23:26
Ich hab zwar nicht verstanden, was der Prescaler macht (die Dokumentation an der Stelle leuchtet mir noch nicht ein).
Der Timer wird vom Prozessortakt versorgt. Der Prescaler ist sozusagen ein Taktteiler, der diesen Prozessortakt um bestimmte, einstellbare Faktoren herunterteilt. Wenn du also einen Prozessortakt von 1 Mhz benutzt und den Prescaler auf 8 stellst, wird der Timer nur noch mit 125 khz versorgt, also um den Faktor 8 langsamer. Alles klar? ;)

pin117
19.04.2012, 23:29
Danke Thomas, das bringt etwas Licht in's Dunkle. Und wie MagicWSmoke mir noch mailte, scheinen meine Motoren wohl beim Prescaler 1 Probleme gehabt zu haben. Das die damit nicht umgehen können, hatte ich mir bislang nicht vorstellen können. Aber jetzt wo ich es weiss, kann ich ja damit umgehen und der Roboter fährt zumindest wieder. Weiter gehts also ... ;)

Danke an Alle die geholfen haben in den schweren Stunden ;))

MagicWSmoke
19.04.2012, 23:40
scheinen meine Motoren wohl beim Prescaler 1 Probleme gehabt zu haben. Das die damit nicht umgehen können, hatte ich mir bislang nicht vorstellen können.
Steht im Datenblatt, erste Seite, PWM-Betrieb bis 20 kHz.