o servo motor eu tirei de uma parabólica.
o modelo é MotorTECH, como na foto:

site fabricante:
http://www.sollaris.com.br/motortech/
tentei fazer umas experiencias com ele atravez de RS232 e PWM, só que não consegui ele dar um giro de 360°, detalhe, já cortei o pino que trava a engrenagem mair dentro dele, mas mesmo assim não consegui.
Alguem já fez algo parecido??
o código que estou usando é:
arquivo main:
- Código: Selecionar todos
#include <16F628A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)
#fuses NOMCLR,INTRC_IO,NOWDT,PUT,NOLVP
#include <string.h> // Necessárioa para a função strcmp()
#include <stdlib.h> // Necessário para a função atol()
#include "funcoes_PWM.h"
char x[8]; // string de caracteres que pode acumular no máximo 7 digitos
// para alterar a quantidade é só mudar esse valor
char y[8] = "freq"; // string de caracteres que pode acumular no máximo 7 digitos
// para alterar a quantidade é só mudar esse valor
char answer;
short int resultado; // Guarda o resultado da comparação das strings
void get_string(char* s, int max) // Função para receber uma string via rs232
{
int len;
char c;
--max;
len=0;
do {
c=getc();
if(c==8) // Se apertar Backspace volta uma tecla
{
if(len>0)
{
len--;
putc(c);
putc(' ');
putc(c);
}
} else if ((c>=' ')&&(c<='~')) // não digitar caracteres
if(len<max)
{
s[len++]=c;
putc(c);
}
if(len==max) // MELHORIA NO CÓDIGO
{ // Sem esse BREAK o programa espera vc apertar
Break; // a tecla ENTER para sair
}
} while(c!=13);
s[len]=0;
}
void main()
{
setup_ccp1(CCP_PWM); // Coloca o ccp1 modo PWM
printf("\n\r+------------------------------------------------------------------+");
printf("\n\rTeste de RS232 GET_STRING - servo motor");
printf("\n\r+------------------------------------------------------------------+");
printf("\n\rdigite freq ou duty e <ENTER>: ");
do {
get_string(x,8); // X é a string de caracteres
// 8 é a quantidade de caracteres definido na string de caracteres
resultado = strcmp(x,y); // Compara as 2 strings
if(resultado==0)
// if(x==y)
{
printf("\r\nConfigurção atual da frequencia: ");
muda_freq();
printf("\r\nAlterar frequencia (y,n)?");
do {
answer=getch();
}while(answer!='y' && answer!='n');
if(answer=='y')
{
printf("\r\n 0 - T2_DIV_BY_16, 239, 1 ");
printf("\r\n 1 - T2_DIV_BY_16, 212, 1 ");
printf("\r\n 2 - T2_DIV_BY_16, 192, 1 ");
printf("\r\n 3 - T2_DIV_BY_16, 180, 1 ");
printf("\r\n 4 - T2_DIV_BY_16, 159, 1 ");
printf("\r\n 5 - T2_DIV_BY_16, 144, 1 ");
printf("\r\n 6 - T2_DIV_BY_16, 128, 1 ");
printf("\r\n 7 - T2_DIV_BY_16, 119, 1 ");
// printf("\r\n 8 - T2_DIV_BY_4, 3, 4 ");
opcao = getc();
printf("\r\nA opcao escolhida foi: %c ",opcao);
muda_freq();
}
} else
{
printf("\r\nValor atual do duty cicle: %lu",valor_duty);
printf("\r\nDigite novo valor: ");
get_string(x,8); // X é a string de caracteres
// 8 é a quantidade de caracteres definido na string de caracteres
valor_duty = atol(x); // Converte sting para long int
muda_duty();
}
printf("\n\rdigite freq ou duty e <ENTER>: ");
} while(1);
}
Arquivo "funcoes_PWM.h"
- Código: Selecionar todos
// Funções de PWM
// #include "funcoes_PWM.h"
// PIC16F628A
char opcao='0'; // variavel encarregada de mostrar menu de frequencias
char duty=0; // variavel encarregada de mostrar menu de larguras de pulso
long int valor_duty; // Valor do duty cicle
// FUNÇÃO ENCARREGADA DE MUDAR A FREQUÊNCIA DO CCP1
void muda_freq(void)
{
switch(opcao) // menu para escolha das frequências
{
case '0': setup_timer_2 (T2_DIV_BY_16, 239, 1); // 3824ms ou 0,261506276150628 Khz
printf("\n\rT2_DIV_BY_16, 239, 1");
Break;
case '1': setup_timer_2 (T2_DIV_BY_16, 212, 1); // 3392ms ou 0,294811320754717 Khz
printf("\n\rT2_DIV_BY_16, 212, 1");
Break;
case '2': setup_timer_2 (T2_DIV_BY_16, 192, 1); // 3072ms ou 0,325520833333333 Khz
printf("\n\rT2_DIV_BY_16, 192, 1");
Break;
case '3': setup_timer_2 (T2_DIV_BY_16, 180, 1); // 2880ms ou 0,347222222222222 Khz
printf("\n\rT2_DIV_BY_16, 180, 1");
Break;
case '4': setup_timer_2 (T2_DIV_BY_16, 159, 1); // 2544ms ou 0,393081761006289 Khz
printf("\n\rT2_DIV_BY_16, 159, 1");
Break;
case '5': setup_timer_2 (T2_DIV_BY_16, 144, 1); // 2304ms ou 0,434027777777778 Khz C
printf("\n\rT2_DIV_BY_16, 144, 1");
Break;
case '6': setup_timer_2 (T2_DIV_BY_16, 128, 1); // 2048ms ou 0,48828125 Khz
printf("\n\rT2_DIV_BY_16, 128, 1");
Break;
case '7': setup_timer_2 (T2_DIV_BY_16, 119, 1); // 1904ms ou 0,525210084033613 Khz
printf("\n\rT2_DIV_BY_16, 119, 1");
Break;
}
// FUNÇÃO ENCARREGADA DE MUDAR A LARGURA DO PULSO
void muda_duty(void)
{
set_pwm1_duty(valor_duty);
}
alguem poderia me dar uma dica??
desde já agradeço quem puder me ajudar, valeu!!!