Zitat von
luma
Ist denn der obige Code wirklich korrekt? Überprüft das doch bitte noch einmal.
Der obige Code ist korrekt, da bin ich mir sicher. Wenn du ihn so auf das RN Control Board gespielt hast sollte eigentlich klar sein, das an den Motorausgängen sich erstmal gar nichts tun kann, dazu müsstest du erst die entsprechenden Enableleitungen des L293D setzen.
Die gemessenen Spannungswerte hören sich doch ganz gut an. Den genauen Wert kannst du mit deinen Multimeter nicht bestimmen, höchstens wenn du einen Tiefpass dahinter baust, ansonsten schafft es das Multimeter nicht das Signal auszuwerten.
Zitat von
luma
und der Motor hat sich ganz schön schnell (wenn auch Widerwillens ;D ). Ich glaube in meinem Fall ist das ein Softwarefehler.
Warum sollte es den ein Softwarefehler sein wenn sich der Motor zu schnell dreht ??
Versuchs mal mit folgendem Programm:
Code:
#include <avr/io.h>
/* F_CPU sollte schon im Makefile definiert sein.
Wenn nicht, dann einfach hier auskommentieren und
Quarzfrequenz entsprechend eintragen */
//#define F_CPU 16000000L
void init(void);
void timer1_init(void);
void delay_ms(unsigned int ms);
/**
* \brief Hauptprogramm
*/
int main(void)
{
init();
timer1_init();
PORTC = (1<<PC6);
PORTB = (1<<PB0);
while(1)
{
OCR1AL += 20;
OCR1BL += 20;
delay_ms(1000);
}
return 0;
}
/* Initialisierung des µC */
void init(void)
{
/* Port A als Eingang deklarieren ( A/D-Wandler Eingänge ) */
DDRA = 0x00;
PORTA = 0x00;
/* Port B als Ausgang deklarieren */
DDRB = 0xff;
PORTB = 0x00;
/* Port C als Ausgang deklarieren */
DDRC = 0xff;
PORTC = 0x00;
/* Port D als Ausgang deklarieren */
DDRD = 0xff;
PORTD = 0x00;
}
/* Timer1 initialisieren */
void timer1_init(void)
{
/* normale 8-bit PWM aktivieren ( nicht invertiert ),
Das Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet */
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
/* Einstellen der PWM-Frequenz auf 14 kHz ( Prescaler = 1 ) */
TCCR1B = (1<<CS10);
/* Interrupts für Timer1 deaktivieren
Achtung : Auch die Interrupts für die anderen Timer stehen in diesem Register */
TIMSK &= ~0x3c;
OCR1A = 0;
OCR1B = 0;
}
/* Eine kleine Warteschleife */
void delay_ms(unsigned int ms)
{
unsigned int zaehler;
while (ms)
{
zaehler = F_CPU / 5000;
while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
ms--;
}
}
Wenn das nicht funktioniert, dann kommentier mal timer1_init(); und die beiden OCR1A Befehle aus und füg mal folgendes ein:
PORTD = (1<<PD4)|(1<<PD5);
Wenn es dann immer noch nicht geht, dann ist irgendwas grundlegendes mit deinem Board falsch
MfG Kjion
Lesezeichen