PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Enable in H-Brücken hinzufügen



Bammel
24.08.2008, 22:16
Hallo,

ich habe folgende H-Brücke bei mir rumliegen (siehe anhang).
das ist die Brücke von dem Cybot von realrobots. nun habe ich einen atmega8 angeschlossen das funktioniert soweit, bis jetzt auch ganz gut. nun wollte ich wissen ob man die platine so umbauen kann das man eine enable leitung hat.

sprich meine vorstellung war, das ich jeweils für den motor rechts oder linkt eine richtung auf high setzte und dann über die enable leitung jeweils das pwm signal liefern könnte um den motor dann über die enable leitung zu steuern.

was auch gut wäre wenn ich die vorwärts und rückwärts richtung mit einem port steuern könnte in dem ich dann nur z.b. vorwärts (high) und rückwärts (low) anlegen müsste. dann hätet ich nämlich nur 4 ports in gebrauch anstatt 6

wäre dies möglich? und wenn ja wie?

Danek schonmal und
MfG Bammel

Hubert.G
25.08.2008, 09:19
Schau dir mal die Ansteuerung des Asuro an: www.arexx.com/downloads/asuro/asuro_manual_de.pdf
Du wirst nur einiges ändern müssen.

uwegw
25.08.2008, 09:43
Die Ansteuerung ist auch über die vorhandenen vier Anschlüsse möglich. Sie entsprechen von der Ansteuerung ja quasi einem L293 mit Enable fest auf high. Und den benutze ich auf meinem Roboter.
Der Trick: für die Rückwärtsfahrt wird die PWM invertiert.

Zufälligerweise arbeite ich auch mit nem M8, hätte also hier den gesamten Code für dich:



#include <avr/io.h>

//die Pins für die Richtungsumschaltung
#define DIR_L_PIN_ON PORTD|=(1<<PD5)
#define DIR_L_PIN_OFF PORTD&=~(1<<PD5)
#define DIR_R_PIN_ON PORTD|=(1<<PD6)
#define DIR_R_PIN_OFF PORTD&=~(1<<PD6)
//PWM-Ports: links 1A (PB1) rechts 1B (PB2)


#define vor 0b10100000
#define rueck 0b01010000
#define stop 0b00000000
#define rdreh 0b01100000
#define ldreh 0b10010000


void initPWM(void)
{
TCCR1A = 0x00;
TCCR1B = 0x00;
//WGM10 = mode 1 = PWM Phase correct TOP=0x00FF, 8bit
//COM1A1 und COM1A0 = 11 = (Table 38 pdf)
// => OC1A high on upcounting compare match, low on downcouting compare match
//COM1B1 und COM1B0 = 11 = (Table 38 pdf)
// => OC1B high on upcounting compare match, low on downcouting compare match
TCCR1A |= (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0); //Timer konfigurieren

//prescaler /8
//TCCR1B |= (1<<CS11);
// /1024
//TCCR1B|= (1<<CS12)|(1<<CS10);

// /256
TCCR1B|=(1<<CS12);

//======>>> port als Ausgang schalten <<<======
//pin B1 (OC1A) und pin 18 (OC1B) als ausgang schalten (ATmega8)
DDRB |=(1<<PB1) | (1<<PB2);
//Richtungsausggänge
DDRD |=(1<<PD5) | (1<<PD6);
}


void PWM_L_non_inv(void)
{
TCCR1A|=(1<<COM1A1);
TCCR1A&=~(1<<COM1A0);
}

void PWM_L_inv(void)
{
TCCR1A|=(1<<COM1A1)|(1<<COM1A0);
}

void PWM_R_non_inv(void)
{
TCCR1A|=(1<<COM1B1);
TCCR1A&=~(1<<COM1B0);
}

void PWM_R_inv(void)
{
TCCR1A|=(1<<COM1B1)|(1<<COM1B0);
}


void setzeMotoren(uint8_t PWML, uint8_t PWMR, uint8_t DIR)
{
switch(DIR)
{
case vor:
PWM_L_inv();
PWM_R_inv();
DIR_L_PIN_ON;
DIR_R_PIN_ON;
OCR1A=PWML;
OCR1B=PWMR;
break;

case rueck:
PWM_L_non_inv();
PWM_R_non_inv();
DIR_L_PIN_OFF;
DIR_R_PIN_OFF;
OCR1A=PWML;
OCR1B=PWMR;
break;

case ldreh:
PWM_L_non_inv();
PWM_R_inv();
DIR_R_PIN_ON;
DIR_L_PIN_OFF;
OCR1A=PWML;
OCR1B=PWMR;
break;

case rdreh:
PWM_R_non_inv();
PWM_L_inv();
DIR_R_PIN_OFF;
DIR_L_PIN_ON;
OCR1A=PWML;
OCR1B=PWMR;
break;

case stop:
default:
PWM_L_non_inv();
PWM_R_non_inv();
DIR_L_PIN_OFF;
DIR_R_PIN_OFF;
OCR1A=0;
OCR1B=0;

} //end.case
} //end.setzemotren

Erst initPWM(); und dann mit setzeMotoren(uint8_t PWML, uint8_t PWMR, uint8_t DIR); ansteuern. PWML und PWMR sind die 8bit-PWM-Werte, DIR die Drehrichtung gemäß den Defines (vor rueck, ldreh,rdreh, stop)

Bammel
25.08.2008, 16:58
hallo, danke für den tip mit dem asuro.

@uwegw
wenn das so klapptz würde ich das sogar bevorzufgen.
das ding ist nur ich programmiere in bascom.
nun weist ich ledier ncoh nciht da ich erst angefangen ahbe wie ich das pwm signal zu inventrieren soll bzw wie ich das dann auch die vier pins bekomme.

den ich dachte jetzt das ich die enable signale an den oc1a/oc1b pins lege.

und dann über einen pin jeweils rückwärs oder vorwärts wählöen kann. aber wenn ich cniht an der paltine fummeln müsste wäre es mir am liebsten.

kannst du mir dass vllt so erklären das ich es in bascom umsetzuten könne?

mfg Bammel

Bammel
30.08.2008, 11:19
hallo,
ich komme heir einfahc cniht weiter.. wie müsste ich das den anschließen?

ich hab nun links-vorwärts und recht-vorwärts jeweil an die oc1a und oc1b pins geklemmt aber was mach ich mit den rückwärts?

hatte mri jetzt schon was mit xor und and gattern aufgezeichnet aber ich möchte eigentlich wnens geht so auskommen wie es nun ist. gehen müsste es so ja den beim original cybot gehts ja scheinbar auch irgendwie.

MfG Bammel