Testador de Servo motor / Controlador de ESC com pic12f675

Boa Tarde pessoal,  estou tentando controlar um servo por pwm (sinals em 50hz e largura de pulso de 1ms até 2ms). Procurei até na pagina 19 do google e não encontrei algo satisfatório. Tentei com meu pouco conhecimento gerar um pseudo-pwm (output_high... delay....) e não ficou certo tb.

Até que achei um código do Claudio Larios: http://larios.tecnologia.ws/iBlog/archives/4271

Porem ele utiliza botões e eu gostaria de utilizar um potenciômetro.

Alguma dica de como alterar esse código ou então de como gerar um código do 0?

A minha linha de raciocino era essa:

http://pastebin.com/wMntUF48

E esse código não dá certo.

Exibições: 682

Responder esta

Respostas a este tópico

Oi Rodrigo, boa tarde.

Eu escrevi um code PWM bitbang, para o PIC12F675, já que o 12F675 não tem o HW do PWM.

Mas eu escrevo em Hi-Tech. C

Voce usa qual compilador?

Veja também este código do Claudio Larios:

http://larios.tecnologia.ws/iBlog/archives/6395,

talvez vc consiga adapta-lo para seu uso.

Rui

Olá Rui,

Eu utilizo o mplab com ccs (achei muito fácil o aprendizado).

O 12f675 realmente não tem hardware de pwm, porem pelo tamanho dele e facilidade de aquisição, é uma boa escolha. Tentei achar algum com hardware pwm e dip8, mas não encontrei para comprar aqui no brasil.

Código que não sei como funciona, mas funciona ahhahaha e resolveu meus problemas.

Fonte: Lários Tecnologia

/*******************************************************************************

TESTA_SERVO_V2.C

Objetivo: Testar servos de 1 a 2 ms com um PIC12f675 e um potenciômetro

Autor: Cláudio Lários

Data: 10/12/2014

Este arquivo é parte integrante do blog LÁRIOS.TECNOLOGIA.WS

*******************************************************************************/
#include <12F675.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, NOPUT, NOBROWNOUT
#zero_ram
#byte tris_gpio =0x85
#byte adcon0 = 0x1f
#byte adressh = 0x1e
#byte ansel = 0x9f
#bit go = 0x1f.1
#bit admf = 0x1f.7
#bit on_adc = 0x1f.0
#bit flagtmr0 = 0x0b.2
#bit out = 0x05.2 //pino 5
int8 valor;
void main() {
setup_adc_ports(sAN3 | VSS_VDD); //seleciona AN3 e 5v como referência
setup_adc(ADC_CLOCK_DIV_8 );// ajusta o clock do adc
set_adc_channel(3); //ajusta para o pino 3 (AN3)
delay_us(10); //delay
setup_counters(RTCC_INTERNAL,RTCC_DIV_8);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
tris_gpio=0b111011;
out=0;
WHILE(1){
valor = READ_ADC();// lê valor da tensão de entrada do pino 3
out=1;
flagtmr0=0;
set_timer0(160);
while(!flagtmr0);//aguarda estouro com 1ms
flagtmr0=0;
set_timer0(~(valor));
while(!flagtmr0);//aguarda estouro com 1ms
out=0;
delay_ms(15);
}
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço