Du kannst jeden freien Pin nehmen, es besteht kein Zusammenhang mit einer Sonderfunktion.
Druckbare Version
Du kannst jeden freien Pin nehmen, es besteht kein Zusammenhang mit einer Sonderfunktion.
Mein Danke an alle, vor allen an Hubert!
Diese Thema ist nun erledigt.
Weiter gehts... was noch fehlt ist; Daten zwischen PC - µC per Funk zu senden.
Aber erstmal, Platine zusammen bauen und in Forum weiter lesen.
Hi,
ich muss noch einmal Stören 8-[
Also habe jetzt 2 Motoren (PC0 bis PC5) an den L293D angeschlossen.
Links/Rechts -drehung
1 Motor 100% / 50%
2 Motor 100% / 100%
Der 2 Motor dreht Rechts nicht mit 50%.
Jetzt habe ich mal die Anschlüsse von 2 Motor (PC3 bis PC5) und 1 Motor (PC0 bis PC3) vertauscht.
Jetzt bekomme ich diese % raus.
Links/Rechts -drehung
2 Motor 100% / 100%
1 Motor 100% / 100%
Das ist doch nicht normal oder?
So sieht der Code aus:
Code:void Getriebe100(void){
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTC|=(1<<PC1)|(1<<PC4); // Motor läuft mit 100%
}
}
void Getriebe50(void){
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTC^=(1<<PC1)^(1<<PC4); //PortD3 toggelt 50%
}
}
Code:switch(rxwert){
case 0x32 :
Getriebe50();
PORTC|=(1<<PC0); // GLRückwärts 50%
PORTC|=(1<<PC3); // GRRückwärts 50%
break;
case 0x33 :
PORTC&= ~(1<<PC0); // GLRückwärts Stop
PORTC&= ~(1<<PC3); // GRRückwärts Stop
break;
case 0x38 :
Getriebe100();
PORTC|=(1<<PC2); // GLVorwärts 100%
PORTC|=(1<<PC5); // GRVorwärts 100%
break;
case 0x39 :
PORTC&= ~(1<<PC2); // GLVorwärts Stop
PORTC&= ~(1<<PC5); // GRVorwärts Stop
break;
}
}
Alle PortC auf Ausgang gestellt.
Hier kannst du dir die Abfrage sparen und gleich so schreibenCode:void Getriebe100(void){
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTC|=(1<<PC1)|(1<<PC4); // Motor läuft mit 100%
}
}
Die beiden Motoren wirst du ja schon mal untereinander vertauscht haben um eiinen Fehler dort auszuschließen. Sonst mal mit einem Oszi auf die PWM-Leitungen schauen ob auch wirklich PWM kommt und alles richtig verkablet ist.Code:void Getriebe100(void){
PORTC|=(1<<PC1)|(1<<PC4); // Motor läuft mit 100%
}
Hi,
danke für den Hinweiß.
Problem 1 hat sich erledigt, du hattest recht, hatte nicht alle PortC als Ausgang deklariert! Zum Test, Motor 1 an Pin PC3 bis PC5 angeschlossen.
Problem 2 besteht immer noch.
Ich kann auch leider nicht mit einen Oszi nachschauen :-(
Leitung sind ok, auch wenn ich die 3 Leitungen von 2 Motor (A,B, Enable) vertausche, dreht der Motor immer schnell. An 2 Motor liegen dann 3,3V beiden Richtungen an.
Der 1 Motor hat 3,0V Links und 1,0V Rechts.
Hört sich an, ob der IC ein weg hat oder?
Du müsstest eingentlich auch den Spannungsunterschied auf der PWM-Leitung vom µC her messen können. Kontrolliere auch noch ob die Leitungen auch wirklich richtig drauf sind, es ist mit auch schon passiert das ich etwas dreimal kontrolliert und jedesmal wieder falsch gemacht habe.
Hi,
also folgende Werte habe ich beim µC gemessen gegen Masse:
an PC1 und PC4 (PWM)
3,2 V bei 100%
0,6 V leer lauf
1,9 V bei 50%
Aus den µC kommt dann alles richtig raus oder?.
Die verdrahtung auf der Platine ist ok.
Ich denke mal, das beim löten der IC zuviel wärme abbekommen hat und dadurch der 2 Motor kaputt ist.
Am IC Pin´s 3,6 und 11,14 ohne Last (Motoren) messe ich:
- 100% 50%
Pin 3,6 -5,52V +5,35V
Pin 11,14 -5,52V +5,52V
beim 2 Motoranschluss Pin 11,14 sind bei 50% 0,2V mehr...
Sieht schon nach IC aus.
Nur die Spannungen, 3,2V an PC1 und PC4, arbeitest du nicht mit 5V, dann sollten auf den Pins auch annähernd 5V sein. Du hast doch einen Mega8, sind AVCC und AGND richtig versorgt, dort auch die Spannung messen.
Jo,
ich habe ja vorher einen Spannungsteiler und habe von dort aus gemessen. Mein Fehler. Ich messe auf Board
Neue Werte:
z.B. PC1 am µC
2,6V und 1,3V - 100% und 50%
Ich bestelle mal einen neuen IC dann wissen wir es
So wieder da :-)
Ich habe jetzt 2 IC. Aber geht trotzdem nicht :-(
Ich habe das Programm umgeschrieben und fahre jetzt nur mit 100%
z.B. wenn ich den Befehl dafür geben vor/zurück/links/rechts zu drehen, drehen sich die 2 Getriebemotoren aber bleiben nicht stehen, muss paar mal drücken dann erst…
Manchmal klappt die Funktion! <- Dachte zu erst Probleme mit Kommunikation (Max232)
Aber:
Die 2 Servos (Werden auch gesteuert) drehen sich ohne Probleme!
Also ist die Kommunikation zwischen PC und µC in Ordnung.
Was ich auch Bemerkt habe:
Wenn ich den Befehl gebe vor/zurück/links/rechts zum drehen, werden die 2 Servos kurz mit bewegt.
Hier der aktuelle Code:
Code:#include <stdint.h>
#include <string.h>
#include <avr/io.h>
#include <stdbool.h>
#include <stdlib.h>
#include <avr/io.h>
#include <AVR/iom8.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 8000000 // clock
#define BAUD 9600
#define bauddivider (unsigned int)(F_CPU / BAUD / 16 - 0.5)
volatile unsigned char rxwert=0x30;
volatile uint8_t takt;
// Timer1 initialisieren
void timer1_init(void)
{
TCCR1A = (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0); // initalize mega8 Timer1
TCCR1B = (1<<CS12);
OCR1A =490; // Servo1 auf Mittelposition vorstellen (477-502)
OCR1B =478; // Servo1 auf Mittelposition vorstellen (477-502)
}
// Timer0 initialisieren
ISR(TIMER0_OVF_vect){
takt++;
}
// UART initialisieren
ISR(USART_RXC_vect){
rxwert= UDR;
}
// COM1 initialisieren
void usart_init(void){
UBRRL = bauddivider; //set baud rate
UBRRH = bauddivider >> 8;
UCSRB = (1<<RXCIE)|(1<<RXEN);
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
// Servo1 initialisieren
void Servo1_init(void){
switch(rxwert){
case 0x51 :
if(OCR1A > 477){ /* Servo1 dreht bis min 477 dann stop */
OCR1A--; /* Pulsbreite verkürzen */
_delay_ms(250);} /* 250ms warten */
UDR = 'H';
break;
case 0x52 :
/* Servo1 nichht drehen */
break;
case 0x57 :
OCR1A =490; // Servo1 auf Mittelposition
break;
case 0x58 :
/* Servo1 nichht drehen */
break;
case 0x45 :
if(OCR1A < 502){ /* Servo dreht bis min 502 dann stop */
OCR1A++; /* Pulsbreite verlängern */
_delay_ms(250);} /* 250ms warten */
break;
case 0x46 :
/* Servo1 nichht drehen */
break;
}
}
// Servo2 initialisieren
void Servo2_init(void){
switch(rxwert){
case 0x41 :
if(OCR1B > 472){ /* Servo2 dreht bis min 472 dann stop */
OCR1B--; /* Pulsbreite verkürzen */
_delay_ms(250);} /* 250ms warten */
break;
case 0x42 :
/* Servo2 nichht drehen */
break;
case 0x53 :
OCR1B =478; // Servo2 auf Mittelposition
break;
case 0x54 :
/* Servo2 nichht drehen */
break;
case 0x44 :
if(OCR1B < 490){ /* Servo dreht bis 490 dann stop */
OCR1B++; /* Pulsbreite verlängern */
_delay_ms(250);} /* 250ms warten */
break;
case 0x43 :
/* Servo2 nichht drehen */
break;
}
}
// Getriebe 100% drehzahl initialisieren
void Getriebe100(void){
PORTC|=(1<<PC2)|(1<<PC5); // Motor läuft mit 100%
}
// Getriebe 50% drehzahl initialisieren
void Getriebe50(void){
if(takt>=10){ //Takt bis 10 zählen
takt=0;
PORTC^=(1<<PC2)^(1<<PC5); //PortD3 toggelt 50%
}
}
// Getriebemotoren initialisieren
void Getriebe(void){
switch(rxwert){
case 0x32 :
Getriebe100(); //Geändert auf 100%
PORTC|=(1<<PC0); // GLRückwärts 50%
PORTC|=(1<<PC3); // GRRückwärts 50%
break;
case 0x33 :
PORTC&= ~(1<<PC0); // GLRückwärts Stop
PORTC&= ~(1<<PC3); // GRRückwärts Stop
break;
case 0x34 :
Getriebe100();
PORTC|=(1<<PC4); // GRVorwärtsRechts 100%
break;
case 0x35 :
PORTC&= ~(1<<PC4); // GRVorwärtsRechts Stop
break;
case 0x36 :
Getriebe100();
PORTC|=(1<<PC1); // GLVorwärtsLinks 100%
break;
case 0x37 :
PORTC&= ~(1<<PC1); // GLVorwärtsLinks Stop
break;
case 0x38 :
Getriebe100();
PORTC|=(1<<PC1); // GLVorwärts 100%
PORTC|=(1<<PC4); // GRVorwärts 100%
break;
case 0x39 :
PORTC&= ~(1<<PC1); // GLVorwärts Stop
PORTC&= ~(1<<PC4); // GRVorwärts Stop
break;
}
}
int main(void) {
usart_init();
DDRB = (1<<PB1)|(1<<PB2); // Pin PB1 und PB2 als Ausgang für Servo1/2
DDRC=(1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5);// PC0=M2Z,PC3=M1Z, PC2=Getriebe1, PC5=Getriebe2, PC1=M2V,PC4=M1V
TCCR0=(1<<CS00); //kein Prescaler
TIMSK|=(1<<TOIE0); // Overflow Interrupt en
timer1_init();
sei();
for(;;){
Getriebe();
Servo1_init();
Servo2_init();
}
}