Serielle Servosteuerung mit PIC

Ich versuche, einen seriellen Servocontroller mit dem Mikrocontroller pic18f4550 herzustellen.

Folgendes, wenn der vollständige Code, den ich ausprobiert habe, ..

Bitte beachten Sie, dass ich derzeit 8-Bit-Hex sende, um nur ein Servo zu steuern. Ich schicke diese Daten von einem Bild zum anderen..

#define FREQ 20000000
#define baud 9600
#define spbrg_value (((FREQ/64)/baud)-1)


unsigned char rx_data(void);
void tx_data(unsigned char);


void main()
{
int i;
double state;
int ip1=0;
SPBRG=spbrg_value;      // Fill the SPBRG register to set the Baud Rate
RCSTA.SPEN=1;           // To activate Serial port (TX and RX pins)
TXSTA.TXEN=1;           // To enable transmission
RCSTA.CREN=1;           // To enable continuous reception

TRISB.RB0=0;

while(1)
{
    ip1=rx_data();    // Receive data from PC

    //this part doesn't gets executed!!
    state=max((ip1/4)+1,12);
    LATB.LATB0=1;

    for (i=0;i<state;i++)
       delay_us(10);

    LATB.LATB0=0;

    for (i=0;i<200-state;i++)
       delay_us(1);
}
}


void tx_data(unsigned char data1)
{
TXREG=data1;                                     // Store data in Transmit register
while(PIR1.TXIF==0);                             // Wait until TXIF gets low
}


unsigned char rx_data(void)
{
while(PIR1.RCIF==0);                           // Wait until RCIF gets low
return RCREG;                                 // Retrieve data from reception register
}

Ich habe sichergestellt, dass die richtigen Daten vom Master-Bild gesendet werden, indem ich es an die serielle Schnittstelle des PCs anschließe und die Ausgabe beobachte.

Wie im Code angegeben, ip1=rx_data();wird der Teil danach nicht ausgeführt.

Ich habe auch bestätigt, indem ich den Teil auskommentiert ip1=rx_data();und dann die Variable ip1 durch einen int-Wert ersetzt habe ... dann bewegt sich das Servo entsprechend dem Wert anstelle von ip1 (der von 0 bis 255 reicht) in die richtige Position.

irgendeine Hilfe?

AKTUALISIEREN:

Mit den in den Antworten gegebenen Vorschlägen habe ich Folgendes überprüft.

1.Both PICs running on 20mhz so frequency is correct.

2.serial data format is correct. i am receiving the proper data to the PC.

3.Wiring checked.

4.decoupling( plz explain how to do proper decoupling).

5.power supply. ( both running of a 5v 1 amp wall chargers).

Das wahrscheinlichste Problem (abgesehen von der Software) ist also möglicherweise die falsche Entkopplung. kann mir das jemand erklären?

Deine Frage hat nichts mit der Servosteuerung zu tun. Ich schlage vor, es umzubenennen und das Tag zu entfernen.
Entkopplung: Ein Kondensator (normalerweise 0,1 uF), der direkt über die MCU-Stromanschlüsse angeschlossen ist.

Antworten (2)

Erstens blockiert Ihr Code. So wartet man nicht auf serielle Daten. Sie müssen das RX-Interrupt-Flag von der Hauptschleife überwachen und, wenn gesetzt, ip1=rx_data();die Daten abrufen. Wenn Ihre Verdrahtung der UART-Pins in Ihrem Fall falsch ist oder keine Daten von der Master-MCU vorliegen, while(PIR1.RCIF==0);ist die Leitung eine Endlosschleife. Das erklärt, warum der Rest Ihres Codes nicht funktioniert.

Zweitens ist mir aufgefallen, dass Sie dem Servo nur einen Impuls pro Steuersignal geben. Die meisten Hobby-RC-Servomotoren erwarten mindestens 3 solcher Impulse, um das Horn zuverlässig zu positionieren.

Nicht nur 3. RC-Servos werden nachlassen, wenn sie keine Impulse mehr erhalten. Sie müssen also kontinuierlich Impulse mit einer Rate von 20 pro Sekunde senden, um die Hornposition zu halten.
Dies gilt, wenn das Servohorn belastet wird und versucht, es zu bewegen. Wenn keine Ladung oder eine kleine Ladung vorhanden ist, reichen 3 Impulse aus, um sie auf den richtigen Trank zu bringen.
3 Impulse reichen möglicherweise nicht aus. Ein Hitec HS-325HB, den ich getestet habe, benötigte 13 bis 14 aufeinanderfolgende Impulse, um von der 1-ms- auf die 2-ms-Position zu wechseln.

Ihr Code scheint gut zu funktionieren. Wenn er also hängen bleibt, läuft rx_data()entweder der PIC auf der falschen Frequenz, das serielle Datenformat ist falsch oder Sie haben ein Hardwareproblem (Verdrahtungsfehler, unzureichende Entkopplung, schlechte Stromversorgung usw.). .

Um eine ausreichende Taktgenauigkeit zu erhalten, sollten Sie einen Kristall- oder Keramikresonator verwenden, und die Konfigurationsbits müssen auf HS-Oszillator eingestellt sein. Überprüfen Sie auch, ob der Master-PIC serielle Daten mit demselben Format und derselben Baudrate sendet (genauer als 2 %). Nur weil Ihr PC es lesen kann, beweist es noch lange nicht, dass es richtig ist!

Ein weiteres mögliches Problem ist, dass Ihr Code nur einen Servoimpuls für jedes empfangene serielle Byte erzeugt. Wenn Sie beabsichtigen, alle 20 ms ein Byte zu senden, ist das in Ordnung, aber beachten Sie, dass das Servo möglicherweise nicht richtig funktioniert, wenn die Impulswiederholungsrate zu niedrig oder zu hoch ist.