PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM



greenday182
28.09.2009, 20:31
Hallo Zusammen!

Bin verzweifelt (*,)

Hab ein uy Board (Atmega16) und möchte mit dem 2 DC Motoren ansteuern über ein Motorsteuerung mit l6205 über ein PWM Signal.

Hier ensteht das Problem. Da ich sehr wenig Erfahrung habe im Bereich C (nur C#) habe ist es nicht leicht das zu realisieren.

Hab mich schon bisschen AtmelCProgrammierung eingelesen und über PWM hier:

http://www.info-rlp.de/lernteams/elektrotechnik/mikrocontroller/atmel/pwm_mit_atmel.html

http://www.hs-augsburg.de/~hhoegl/tmp/da-liehr/Tutorial/programmierung/timercounter.html ]


Aber ich werde irgenwie nicht Schlau. *ich trottel*

Kann mir das einer vielleicht Idiotensicher erklähren.

Also so wie ich das verstehen hab muss ich das Register setzten und dies und das.....


Bitte um hilfe komme mir echt schon ziemlich doof vor.

mfg greeni

Thomas$
28.09.2009, 20:38
ich habe es damit heilwegst begriffen http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

greenday182
28.09.2009, 20:50
............................................

greenday182
28.09.2009, 20:51
Mhh werde nicht schlauer :(

WIe muss ich nun dieses Beispielprogramm umschreiben das ich bei Atmega16 das 16bit PWM Signal benutzen kann (ich weiss nur das ich dazu OC1A OC2B zum motor führen muss):



#include <avr/io.h>

int main()
{
// OC1A auf Ausgang
DDRB = (1 << PB1 ); //ATMega8
// DDRD = (1 << PD5 ); //ATMega16
//
// Timer 1 einstellen
//
// Modus 14:
// Fast PWM, Top von ICR1
//
// WGM13 WGM12 WGM11 WGM10
// 1 1 1 0
//
// Timer Vorteiler: 1
// CS12 CS11 CS10
// 0 0 1
//
// Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
// COM1A1 COM1A0
// 1 0

TCCR1A = (1<<COM1A1) | (1<<WGM11);
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);

// den Endwert (TOP) für den Zähler setzen
// der Zähler zählt bis zu diesem Wert

ICR1 = 0x6FFF;

// der Compare Wert
// Wenn der Zähler diesen Wert erreicht, wird mit
// obiger Konfiguration der OC1A Ausgang abgeschaltet
// Sobald der Zähler wieder bei 0 startet, wird der
// Ausgang wieder auf 1 gesetzt
//
// Durch Verändern dieses Wertes, werden die unterschiedlichen
// PWM Werte eingestellt.

OCR1A = 0x3FFF;

while( 1 )
;
}

Thomas$
28.09.2009, 20:58
......
DDRD = (1 << PD5 ); //ATMega16
TCCR1A = (1<<WGM10)|(1<<COM1A1);
TCCR1B = (1<<CS10);
OCR1A =128;//0 oder OCR1A = blabale was du willst
......

dann solltest du erstmal mit eine led testen ob du von pd5 zu gnd über den gesetzten werd die hellig keit der led stellen kannst wenn das geht. kannste dein motorzeug ranhängen

greenday182
28.09.2009, 21:03
Danke :)

Kannst du mir auch erklähren wieso O:)

wenn ich dich noch um etwas bitten darf

Thomas$
28.09.2009, 21:15
gehts? ich veruche mal zu erklären wenn was falsch ist an alle wissenden sagt es bitte.
TCCR1A = (1<<WGM10)|(1<<COM1A1) /// (1<<WGM10 heißt nach pwm10 ist gesetzt und pwm01 ist nicht gesetzt was das bedeutet kannst du in der tabelle dort sehen
|(1<<COM1A1 heißt com1A1 gesetzt und com1A0 ist nicht gesetzt also o was das bedeutet in der tabelle darunter
TCCR1B = (1<<CS10); cs10 heißt precaler =0 wenn du schreiben würdest TCCR1B = (1<<CS10)|(1<<CS12) heist prescaler 1024 hast du es jetzt verstanden?

greenday182
28.09.2009, 21:31
naja ich muss mich glaub nochmal voll reinhauen

ich kann es erst am DO wieder ausprobieren ob so funktioniert
ich schreib wieder falls ich noch fragen hab

danke nochmal

falls einer noch ne ander erklähren hat bin ich gerne offen für jede Hilfe !!!

greenday182
29.09.2009, 21:16
JUHU glaub langsamm kapier ich es \:D/


Wenn ich aber nur das COM1A1 setzt hab ich ein invertiertes PWM oder ?
Da muss ich noch COM1A0 auch noch setzten ?

Kapier jetzt nur noch nicht wie ich ein 16bit PWM jetzt erzeugen kann ?

Wenn ich PWM11 PWM10 setze hab ich ja nur ein 10bit PWM oder ?


mfg greeni

greenday182
01.10.2009, 17:05
Was ist hier falsch ? Bitte um Hilfe



#include <AVR/io.h>
#include <AVR/interrupt.h>
#include <AVR/signal.h>


int main( void )
{
DDRD = 0x30; //PD4 PD5 PWM Ausgang
TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0);
TCCR1B = (1<<CS10);

OCR1A = 6000;


while(1) //Hauptschleife
{

}
}