PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Bascom PWM Beispiele für Megas



16.02.2004, 09:34
Hi

Suche Bascom PWM Beispiele für Mega16. Konkret suche ich ein Beispiel zur Geschwindigkeitsregelung von 2 Motoren.

16.02.2004, 12:30
Vielleicht funktioniert das:



' PULS WEITEN MODULATION (PWM)
' Sprache: Bascom AVR-Basic (Demoversion 1.11.6.2)
' Getestet mit 8 MHz auf 90S2333.Ausgabewert wird dann ca. 121 mal pro Sekunde
' erneuert.
' 3 Kanäle an Port B0, B1, B2
' Bewust einfaches Programm zur Erklärung wie eine Software PWM funktionieren kann.
' Timerinterupt, der in gleichmäßigen Abständen
' das Hauptprogramm unterbricht und ein Unterprogramm (Interupthandler) aufruft
' das die Ausgänge ein oder ausschaltet. Im Mittel ergibt sich dann der gewünschte
' Ausgabewert (Normale Multimeter sind langsam genug d.h. der Ausgabewert kann
' für Testzwecke direkt am Pin gemessen werden)
' Sept. 2002 Bernhard T.



'Timer konfigurieren, Vorteiler auf 1 ist gut fürs Simulieren (evtl. anpassen, dann aber ausgang mit R-C Tiefpass)
Config Timer0 = Timer , Prescale = 1

'Definiere den Interrupthandler
On Ovf0 Tim0_isr

'Wichtig:
Config Pinb.0 = Output 'Port B = Ausgang
Config Pinb.1 = Output
Config Pinb.2 = Output

Enable Timer0 'timer einschalten
Enable Interrupts 'interrupts einschalten

Dim R As Byte ' In diese Variablen muss man
Dim G As Byte ' im Hauptprogram die gewünschten
Dim B As Byte ' Ausgabewerte laden

Dim Z As Word 'Byte ' Zähler

Dim Ri As Byte ' Hilfsregister
Dim Gi As Byte
Dim Bi As Byte




Z = 0

Do
'your program goes here
'Bsp.:

'R = 51 ' bei Ub= 5V ca. 1Volt
'G = 102 ' ca. 2V
'B = 1 ' 5V/256 = 0.01953125 V Soll

R = 255
G = 255
B = 255

Schleife:
Goto Schleife


Loop

'Interupthandler, wird bei jedem Timerüberlauf(bei 8 MHz und Vorteiler=1 alle 32 µSec.)
'aufgerufen:
Tim0_isr:

If Z = 0 Then 'Gewünschte Ausgabewerte an
Ri = R 'Hilfsregister übergeben
Gi = G
Bi = B
Z = 255
End If

Z = Z - 1

If Ri > 0 Then 'R > Port B.0
Portb.0 = 1 'bei R = 51 wird hier
Else 'Port B.0 51 mal auf 1
Portb.0 = 0 'und 205 mal auf 0 geschaltet
End If 'das ergibt bei 5V Ub im Mittel
Ri = Ri - 1 ' ca. 1 V
If Ri = 255 Then Ri = 0

If Gi > 0 Then 'G > Port B.1
Portb.1 = 1
Else
Portb.1 = 0
End If
Gi = Gi - 1
If Gi = 255 Then Gi = 0

If Bi > 0 Then
Portb.2 = 1 'B > Port B.2
Else
Portb.2 = 0
End If
Bi = Bi - 1
If Bi = 255 Then Bi = 0

' Hier könnten eigentlich noch weitere Kanäle eingefügt werden

Return

27.04.2004, 11:53
What is the frequency of the PWM this code?

I was just wondering.

Thanks

Pascal

Skorpion011152
29.08.2004, 18:35
Hallo Leute,

habe das RNBFRA-Bord Fertig und alle mit gelieferten testbeispiele durch getestet... es läuft alles prima.

Nun hänge ich fest, ich möchte zu dem Beispiel 'testprg5.bas' -ist für schrittmoteren links/rechts drehen- auch die geschwindigkeit ändern -regeln- wie stelle ich das an ???

Unter den 'samples-dateien' im BASCOM-AVR finde ich keine beispiele dafür. dazu kommt das ich kein englisch kann ;-)

habe schon hier und in suchmaschinen gegooglt aber bin nicht fündig geworden.

der beitrag weiter oben sollte evtl. sowas sein aber stimmen dort die port's und wie binde ich den code an welcher stelle ein.

hier mein Code: Testprg5.bas

'Testprogramm 5
'für
'RoboterNetz Standard-Roboter Board RBNFRA 1.2
'
'Aufgabe:
'Testen der Schrittmotortreiber
'Dreht erst linken Schrittmotor in beide Richtungen
'und dann rechten Schrittmotor in beide richtungen
'
'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de
'################################################# ##

Declare Sub Ledein
Declare Sub Ledaus


Const Writepowerport_adr = &H72 'I2C Adr PCF 2
Const Readpowerport_adr = &H73 'I2C Adr PCF 2

Dim I2cdaten As Byte 'Datenbyte aus PCF8574


Dim I As Word


$crystal = 8000000 'Quarzfrequenz
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1
I2cinit


'******** Diese 4 Befehle sind nur ab RNBFRA Version 1.2 (nicht in V 1.1)
' notwendig und bzw. möglich (erweiterte Energiesparfunktion und LED´s)
' Bei Board 1.1 bitte auskommentieren oder löschen
I2cstart
I2cwbyte &H74 'Schreibbefehl an PCF3 schicken
' Led´s ein ,Motorendstufen ein, Port-Peripherie ein, RBN-Bus Sleep Modus aus (also Peripherie aktiv)
I2cwbyte &B00000010 'Datenbyte an PCF3
I2cstop
'*********




Config Pind.6 = Output 'Schrittmotoren Ein/Aus
Config Pinc.5 = Output 'Schrittmotor Links Richtung
Config Pinc.3 = Output 'Schrittmotor Links Step

Config Pinc.4 = Output 'Schrittmotor Rechts Richtung
Config Pinc.2 = Output 'Schrittmotor Rechts Step

Ledaus
Portd.6 = 0 'Schrittmotoren erst mal ausschalten

Wait 2

Ledein
Portd.6 = 1 'Beide Schrittmotoren einschalten

'Linker Schrittmotor
Portc.5 = 0 'Richtung
Portc.3 = 0
I = 400 'Anzahl der Schritte die Motor bewegt werden soll
Do
Ledaus
Portc.3 = 0
Waitms 5
Portc.3 = 1
Ledein
Waitms 5
I = I - 1
Loop Until I < 1

Portc.5 = 1 'Andere Richtung
I = 400 'Anzahl der Schritte die Motor bewegt werden soll
Do
Ledaus
Portc.3 = 0
Waitms 5
Portc.3 = 1
Ledein
Waitms 5
I = I - 1
Loop Until I < 1

Wait 2

'Rechter Schrittmotor
Portc.4 = 0 'Richtung
I = 400 'Anzahl der Schritte die Motor bewegt werden soll
Do
Ledaus
Portc.2 = 0
Waitms 5
Portc.2 = 1
Ledein
Waitms 5
I = I - 1
Loop Until I < 1

Portc.4 = 1 'Andere Richtung
I = 400 'Anzahl der Schritte die Motor bewegt werden soll
Do
Ledaus
Portc.2 = 0
Waitms 5
Portc.2 = 1
Ledein
Waitms 5
I = I - 1
Loop Until I < 1



Portd.6 = 0 ' Schrittmotoren erst mal ausschalten
Ledaus

End




Sub Ledein()
I2cstart
I2cwbyte Writepowerport_adr 'Schreibbefehl an PCF schicken
I2cwbyte 15 'Datenbyte an PCF
I2cstop
End Sub

Sub Ledaus
I2cstart
I2cwbyte Writepowerport_adr 'Schreibbefehl an PCF schicken
I2cwbyte 0 'Datenbyte an PCF
I2cstop
End Sub
************************************************** ********

wußte leider nicht wie ich den code anders hier einfügen kann.

mfg Skorpi