Hallo Apfeldieb,
hier mal ein Code für einen Atmega32:
Dabei werden bei untersch. PWM-Frequenzen die OCR1 Werte in einer for-Schleife hochgezählt, danach auf null gesetzt und nochmal kurz auf volldampf.Code:#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> /*------------------------------------------------------------------------------------------------*/ volatile unsigned char buffer; int i,a; /*------------------------------------------------------------------------------------------------*/ void uart_init(void); void port(void); void Motor (void); /*------------------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------------------*/ int main(void) { port(); uart_init(); while (1){ Motor(); } } /*------------------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------------------*/ void uart_init(void) { /* Baudrate: 115200*/ UBRRH = 0; UBRRL = 7; UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); } /*------------------------------------------------------------------------------------------------*/ /* Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer liegen */ SIGNAL(SIG_UART_RECV) { buffer = UDR; } /*------------------------------------------------------------------------------------------------*/ void port(void) { DDRD =0x30; DDRB =0x17; } /*------------------------------------------------------------------------------------------------*/ void Motor (void) { while(1){ sei(); /*-----3600------*/ if (buffer=='1') { buffer =0; PORTD =0x30; TCCR1A = 0xA1; TCCR1B = 0x02; PORTB =0x11; for (i=0;i<255;i++) { OCR1A =i++; OCR1B =i++; for (a=0;a<11;a++){ _delay_ms (10);} } OCR1A =0; OCR1B =0; for (a=0;a<100;a++){ _delay_ms (10);} OCR1A =255; OCR1B =255; for (a=0;a<100;a++){ _delay_ms (10);} OCR1A =0; OCR1B =0; } /*-----7200------*/ if (buffer=='2'){ buffer =0; PORTD =0x30; TCCR1A = 0xA3; TCCR1B = 0x01; PORTB =0x11; for (i=0;i<1023;i++) { OCR1A =i++; OCR1B =i++; for (a=0;a<3;a++){ _delay_ms (10);} } OCR1A =0; OCR1B =0; for (a=0;a<100;a++){ _delay_ms (10);} OCR1A =1023; OCR1B =1023; for (a=0;a<100;a++){ _delay_ms (10);} OCR1A =0; OCR1B =0; } /*-----14400------*/ if (buffer=='3') { buffer =0; PORTD =0x30; TCCR1A = 0xA2; TCCR1B = 0x01; PORTB =0x11; for (i=0;i<511;i++) { OCR1A =i++; OCR1B =i++; for (a=0;a<6;a++){ _delay_ms (10);} } OCR1A =0; OCR1B =0; for (a=0;a<100;a++){ _delay_ms (10);} OCR1A =511; OCR1B =511; for (a=0;a<100;a++){ _delay_ms (10);} OCR1A =0; OCR1B =0; } /*-----28800------*/ if (buffer=='4') { buffer =0; PORTD =0x30; TCCR1A = 0xA1; TCCR1B = 0x01; PORTB =0x11; for (i=0;i<255;i++) { OCR1A =i++; OCR1B =i++; for (a=0;a<11;a++){ _delay_ms (10);} } OCR1A =0; OCR1B =0; for (a=0;a<100;a++){ _delay_ms (10);} OCR1A =255; OCR1B =255; for (a=0;a<100;a++){ _delay_ms (10);} OCR1A =0; OCR1B =0; } } }
War mal für ein Motortest.
Die Interrupt-Sache habe ich selbst nur aus dem Netz zurecht gestückelt, das andere mit Hilfe des Forums und des Datenblattes.
Hier noch eine kleine Übersicht über die Frequenzeinstellung.
http://www.deviantart.com/deviation/49689249/
Gruß
Stefan






Zitieren

Lesezeichen