Para aqueles que usam o CCS compiler, como eu, aqui vai uma função facilmente implementavel para a geração de PWM via software, ela foi criada por mim, ela controla servos que funcionam de 500ms(0°) a 2500ms(180°) de periodo, isso é perfeitamente ajustavel na própria função, somente testado, e muito, com PIC 16F628A.
Função Software PWM (controla_servo) |
struct matriz_servo { long pos_atual; int saida; int led; }servo1; //Função que controla o servo short controla_servo(struct matriz_servo *servo_con,long posicao_des) { long tempo_pos; long tempo_comp_18ms; int i,precisao_servo; if (posicao_des>pos_max) return 0; precisao_servo=abs(((signed long) ((servo_con->pos_atual)-posicao_des))/2); servo_con->pos_atual=posicao_des; if (servo_con->led!=0) output_high(servo_con->led); tempo_comp_18ms=(18000-(servo_con->pos_atual)); tempo_pos=(500+10*(servo_con->pos_atual)); //Modifique aqui se o seu servo começa em outro período. disable_interrupts(GLOBAL); for (i=0;i<=precisao_servo;i++) { output_high(servo_con->saida); delay_us(tempo_pos); output_low(servo_con->saida); delay_us(tempo_comp_18ms); } if (servo_con->led!=0) output_low(servo_con->led); enable_interrupts(GLOBAL); return 1; } //Inicializações servo1.saida=servo1_pin; //Lembre se de definir o pino com #define servo1_pin RXx servo2.saida=servo2_pin; #ifdef led_servo1 servo1.led=led_servo1; #else servo1.led=0; servo2.led=0; #endif servo1.pos_atual=100; controla_servo(&servo1,0); //Nunca se esqueça que servo1 é um ponteiro, entao eu passo somente o ender. /*Isto é feito porque o tamanho do pulso, é dado em função de posição desejada menos a anterior, entao como quero que ele va para 0, digo que ele estava em 100 para gerar uma diferença e o servo mover */ |
0 comentários:
Postar um comentário
Por favor, dê as suas sugestões