probot32
28.03.2014, 17:30
Guten spätnachmitag,
Ich habe vor wenigen Wochen das PWM servoshield (PCA9685 (http://www.adafruit.com/datasheets/PCA9685.pdf)) von Adafruit erworben und möchte dieses nun über meine Mega32 (http://www.conrad.de/ce/de/product/198206/C-Control-C-Control-PRO-Unit-Mega-32-45-55-VDC-Eingaenge-Ausgaenge-8-Analogeingaenge-4-mit-je-8-Pins-IOs-Flash-Sp?ref=searchDetail) mit meinem Projektboard (http://www.conrad.de/ce/de/product/197287/?insert=38&insertNoDeeplink&productname=C-Control-C-Control-Projectboard-PRO-32) von Conrad über I2C direkt ansteuern.
Laut dem zurückgelieferten Status meines C-controls sendet der PWM-chip ein ACK. also kann ich sicher gehen, dass der Chip funktioniert und ich die richtige I2C-addresse angegeben habe.
Nun zu meinem Problem: Ich möchte die Frequenz meines Moduls (für die Ansteuerung von Servos) auf 50 Hz setzen und dann den Servo auf Pinn4 auf die Mittelposition stellen. Hierzu habe ich folgenden Programm-code (nach dem Beispiel des Datenblattes auf seite 33) geschrieben, jedoch reagiert der Servo nicht. Ist es so richtig, dass ich über I2C die Befehle einfach hintereinander angebe? Was habe ich falsch gemacht?
#define PWM_MODE1 0x0
#define PWM_PRESCALE 0xFE
#define PWM_adr 0x90
#define PWM_freq 121 // ((25*10^6)/4096*hz)-1
#define on_time 0x1001
#define off_time 0x012C // (180-400)
void main(void)
{
I2C_Init(I2C_100kHz); // I2C Bit Rate: 100 kHz
I2C_Start();
I2C_Write(PWM_adr);
I2C_Write(PWM_MODE1); // MODE1 (register)
I2C_Write(0b00110000); // = sleep
I2C_Stop();
I2C_Start();
I2C_Write(PWM_adr);
I2C_Write(PWM_PRESCALE);// PRE_SCALE (frequenz)
I2C_Write(PWM_freq); // =
I2C_Stop();
I2C_Start();
I2C_Write(PWM_adr);
I2C_Write(PWM_MODE1); // MODE1 (register)
I2C_Write(0b00100000); // = refresh PWM
I2C_Stop();
I2C_Start(); // I2C startsequenz
I2C_Write(PWM_adr); // SLAVE-adr. übermitteln
I2C_Write(0x16); // Register LED4 On low
I2C_Write(on_time); // on send low 8 bits
I2C_Write(on_time>>8); // on send heigh 8 bits
I2C_Write(0x18); // Register LED4 Off low
I2C_Write(off_time); // off send low 8 bits
I2C_Write(off_time>>8);// off send heigh 8 bits
I2C_Stop(); // I2C Stopsequenz
I2C_Start();
I2C_Write(PWM_adr);
I2C_Write(PWM_MODE1); // MODE1 (register)
I2C_Write(0b10100000); // = normal_mode
I2C_Stop();
}
Den Servo habe ich richtig angeschlossen und er sowie das C-control funktionieren einwandfrei.
Ich habe vor wenigen Wochen das PWM servoshield (PCA9685 (http://www.adafruit.com/datasheets/PCA9685.pdf)) von Adafruit erworben und möchte dieses nun über meine Mega32 (http://www.conrad.de/ce/de/product/198206/C-Control-C-Control-PRO-Unit-Mega-32-45-55-VDC-Eingaenge-Ausgaenge-8-Analogeingaenge-4-mit-je-8-Pins-IOs-Flash-Sp?ref=searchDetail) mit meinem Projektboard (http://www.conrad.de/ce/de/product/197287/?insert=38&insertNoDeeplink&productname=C-Control-C-Control-Projectboard-PRO-32) von Conrad über I2C direkt ansteuern.
Laut dem zurückgelieferten Status meines C-controls sendet der PWM-chip ein ACK. also kann ich sicher gehen, dass der Chip funktioniert und ich die richtige I2C-addresse angegeben habe.
Nun zu meinem Problem: Ich möchte die Frequenz meines Moduls (für die Ansteuerung von Servos) auf 50 Hz setzen und dann den Servo auf Pinn4 auf die Mittelposition stellen. Hierzu habe ich folgenden Programm-code (nach dem Beispiel des Datenblattes auf seite 33) geschrieben, jedoch reagiert der Servo nicht. Ist es so richtig, dass ich über I2C die Befehle einfach hintereinander angebe? Was habe ich falsch gemacht?
#define PWM_MODE1 0x0
#define PWM_PRESCALE 0xFE
#define PWM_adr 0x90
#define PWM_freq 121 // ((25*10^6)/4096*hz)-1
#define on_time 0x1001
#define off_time 0x012C // (180-400)
void main(void)
{
I2C_Init(I2C_100kHz); // I2C Bit Rate: 100 kHz
I2C_Start();
I2C_Write(PWM_adr);
I2C_Write(PWM_MODE1); // MODE1 (register)
I2C_Write(0b00110000); // = sleep
I2C_Stop();
I2C_Start();
I2C_Write(PWM_adr);
I2C_Write(PWM_PRESCALE);// PRE_SCALE (frequenz)
I2C_Write(PWM_freq); // =
I2C_Stop();
I2C_Start();
I2C_Write(PWM_adr);
I2C_Write(PWM_MODE1); // MODE1 (register)
I2C_Write(0b00100000); // = refresh PWM
I2C_Stop();
I2C_Start(); // I2C startsequenz
I2C_Write(PWM_adr); // SLAVE-adr. übermitteln
I2C_Write(0x16); // Register LED4 On low
I2C_Write(on_time); // on send low 8 bits
I2C_Write(on_time>>8); // on send heigh 8 bits
I2C_Write(0x18); // Register LED4 Off low
I2C_Write(off_time); // off send low 8 bits
I2C_Write(off_time>>8);// off send heigh 8 bits
I2C_Stop(); // I2C Stopsequenz
I2C_Start();
I2C_Write(PWM_adr);
I2C_Write(PWM_MODE1); // MODE1 (register)
I2C_Write(0b10100000); // = normal_mode
I2C_Stop();
}
Den Servo habe ich richtig angeschlossen und er sowie das C-control funktionieren einwandfrei.