BASIC4MCU | 질문게시판 | 답변 : ATmega328p + pca9685 + 서보모터
페이지 정보
작성자 master 작성일2023-02-08 14:24 조회5,007회 댓글2건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=22310
본문
https://github.com/prestonsn/PCA9685-Multi-Channel-Servo-Controller-Driver-for-AVR-ATmega
위에 올려준 링크의 코드에서 pca9685_servo() 함수를 보면
void pca9685_servo(uint8_t servoNum, float angle){
if (angle > 90) { angle = 90; } else if (angle < -90) { angle = -90; }
uint16_t pulse_us = 1500 + angle*10;
us 변환을 여기에서 하고 있습니다.함수를 복사해서 이름을 변경하고 내용을 조금 변경하면 되겠습니다.void my_pca9685_servo(uint8_t servoNum, uint16_t usec){//if (angle > 90) { angle = 90; } else if (angle < -90) { angle = -90; } // 주석처리uint16_t pulse_us = usec; //1500 + angle*10;uint16_t period_us = 20000; // (float)1000000 / 50Hz;uint16_t count = (float)pulse_us/20000 * 4096; //((float)pulse_us / period_us) * 4096;uint8_t offLowCmnd = count;uint8_t offHighCmnd = count >> 8;i2c_tx_start(MASTER_TRANSMITTER); i2c_tx_address(0x40 + globalAddress); i2c_tx_byte(SERVO0 + (4 * servoNum));i2c_tx_byte(0x00); i2c_tx_byte(0x00); i2c_tx_byte(offLowCmnd); i2c_tx_byte(offHighCmnd); i2c_tx_stop();}usec의 범위는 600~2400 범위를 입력해주면 됩니다.//#include <avr/io.h>#include <util/delay.h>#include "pca9685.h"//void my_pca9685_servo(uint8_t servoNum, uint16_t usec){//if (angle > 90) { angle = 90; } else if (angle < -90) { angle = -90; } // 주석처리uint16_t pulse_us = usec; //1500 + angle*10;uint16_t period_us = 20000; // (float)1000000 / 50Hz;uint16_t count = (float)pulse_us/20000 * 4096; //((float)pulse_us / period_us) * 4096;uint8_t offLowCmnd = count;uint8_t offHighCmnd = count >> 8;i2c_tx_start(MASTER_TRANSMITTER); i2c_tx_address(0x40 + globalAddress); i2c_tx_byte(SERVO0 + (4 * servoNum));i2c_tx_byte(0x00); i2c_tx_byte(0x00); i2c_tx_byte(offLowCmnd); i2c_tx_byte(offHighCmnd); i2c_tx_stop();}//int main(void){uint16_t usec = 0;pca9685_init(0x00, 50); // start PCA9685 device 0x00 at 50 Hz output_delay_ms(5);pca9685_servo(0, 0);while (1) {pca9685_servo(0, 0); // set servo0 position to 0 degreesfor (usec= 600; usec<=2400; usec+=10){ my_pca9685_servo(0, usec); _delay_ms(25); }for (usec=2400; usec>= 600; usec-=10){ my_pca9685_servo(0, usec); _delay_ms(25); }}return 0;}
댓글 2
조회수 5,007토비님의 댓글
토비 작성일감사합니다. 덕분에 해결되었습니다!!
master님의 댓글
master 작성일1도당 10usec 정도입니다.