PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pwm in c ?!?



apfeldieb
11.08.2007, 08:32
Hi
also ich versuche eigentlich nur nen Beispielcode für eine pwm in C zu finden.
Scheinbar ist ja Assembler wesentlich beliebter aber da hab ich noch weniger ahnung als in C.
Also ich habe mir das Tutuorial bei mikrocontroller.net durchgelesen und meine es auch verstanden zu haben aber mir fehlt halt noch so nen Beispiel wo ich vergleichen kann was ich scheinbar übersehen habe.

Ich will nen Atmega8 verwenden. So habi ch leider nichts gefunden über die Suche auch nicht wirklich bei Google.
würde mich freuen wenn mir einer nen denkansatz gebeen könnte.

Reeper
11.08.2007, 10:37
Hallo Apfeldieb,

hier mal ein Code für einen Atmega32:


#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;
}

}
}

Dabei werden bei untersch. PWM-Frequenzen die OCR1 Werte in einer for-Schleife hochgezählt, danach auf null gesetzt und nochmal kurz auf volldampf.
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

apfeldieb
11.08.2007, 10:42
danke :)
das hilft glaub sehr gut weiter :)
werd mich gleich an die arbeit machen