PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM an M32 mit Timer 1



proevofreak
07.06.2009, 16:12
Hallo, beschäftige mich schon seit ein paar tagen mit dem thema PWM. dazu hab ich diverse internetthreads durch gelesen und bin auf folgendes progrämmchen gestoßen:




#include "RP6ControlLib.h" // The RP6 Control Library.
// Always needs to be included!

int main (void)
{initRP6Control();


DDRD |= (1 << PD4); // PWM Ausgang


TIMSK |= (1<<OCIE1A); // Interrupt bei Compare A

TCCR1A |= (1 << COM1A1); //set am Periodenanfang, clear bei Vergleich

TCCR1B |= (1 << WGM12);

TCCR1A |= ( 1 << WGM10 |1<<WGM11); // FastPWM 10-Bit

OCR1A = (200); // Anfangsvergleichwert

TCCR1B |= ((1 << CS10)); // Starte Timer mit Fcpu/1

sei();

while(1)
{
}



return 1;
};



Mir gehts vorerst mal nur darum die led4 zu dimmen.
jetzt hab ich mal am pin STR versucht spannung gegen GND zu messen.
Aber irgendwie kann ich nix messen, obwohl die LED4 leuchtet.

Kann mir vielleicht jemand sagen, ob dieses Programm zur PWM- Dimmung einer LED genügt?

Gruß

yaro
07.06.2009, 17:20
Wenn du dich mit einer Funktion eines Controllers beschäftigst, dann lohnt es sich immer zuerst das Datenblatt zu lesen. http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf (Kapitel: 16bit Timer/Counter 1)

Das Programm sieht ansonsten ganz ok aus, nur dass "TIMSK |= (1<<OCIE1A); // Interrupt bei Compare A " unnötig ist, da du den Interrupt ja garnicht verwendest.
Mit OCR1A stellst du die Dimmung der LED ein, je kleiner der Wert, desto gedimmter die LED.
Stell den Wert auf 900, dann solltet du auch eine vernünftige Spannung messen können.

Gruß, Yaro

proevofreak
07.06.2009, 17:51
dass das TIMSK- Register nicht gesetzt werden muss, wenn man die PWM ohne Interrupt macht hab ich auch schon vermutet. Das Datenblatt hab ich schon ausgiebig durchforstet, sonst wär ich auch gar nicht in der lage gewesen dieses kurze programm zu schreiben.

Allerdings besteht immer noch mein oben beschriebenes problem. und zwar kann ich nach wie vor an pin STR keine spannung messen. auch nicht mit OCR1A= 900.
Aber vielleicht messe ich auch am falschen pin. also, wenn ich den Schaltplan der M32 richtig lese wird PD4 auf STR geführt.

Aber vielleicht kann mich da jemand genauer aufklären?

gruß

proevofreak
07.06.2009, 18:56
jetzt hab ich gerade nochmal das datenblatt durchgeschaut. kann es sein, dass es nicht TCCR1B |= (1 << WGM12);
sondern TCCR1A |= (1 << WGM12); heißen muss?
gruß

proevofreak
10.06.2009, 14:50
so, jetzt hab ich mal ein fertiges programm geschrieben um eine am PD5 am M32 angeschlossene LED zu dimmen.




#include "RP6ControlLib.h"

int main (void)
{


DDRD |= (1 << PD5); // PWM Ausgang


TCCR1A |= (1 << COM1A1); //set am Periodenanfang, clear bei Vergleich

TCCR1B |= (1 << WGM12);
TCCR1A |= ( 1 << WGM10 |1<<WGM11); // FastPWM 10-Bit


TCCR1B |= ((1 << CS10)); // Vorteiler= 1


showScreenLCD("ADC Value:", "Button: T");
while(true)
{

uint8_t key = getPressedKeyNumber();

if(key)
{
uint16_t key_adc = readADC(ADC_KEYPAD);
setCursorPosLCD(0, 11);

setCursorPosLCD(1, 9);

writeInteger(key_adc,DEC);
writeString_P(" --> Pressed key:");
writeInteger(key,DEC);
writeChar('\n');

while(getPressedKeyNumber());

switch(key)
{case 1: //Taster 1
OCR1A=(100);
break;
case 2: //Taster 2
OCR1A=(1000);
break;
}
}
}
return 0;
}


Was mich jetzt aber sehr interessieren würde ist die tatsache, dass dieses programm nicht funktioniert, wenn ich in den main- teil initRP6Control(); mit einbaue. ich kann mir den grund nicht erklären aber vielleicht kann mich jemand aufklären?

gruß