Aula de programação C – 14

14. PRÁTICA 14: CONTROLE DE SERVO MOTOR COM BOTÃO – INTERRUPÇÃO

Referencial Teórico: PWM por Sofware; Laço FOR, Variáveis.

Objetivo: Controlar o funcionamento de um servo motor, utilizando técnica de interrupção por tempo.

Materiais: Utilizar botão presente na placa, servo motor ligado à saída A e fonte de alimentação.

14.1 Arquivo Principal

#include "iniciog.h"
#include "pratica.h"

void main(){

	configura_portas();
	habilita_ponteh();
	MTR1_CW = 1;
	MTR2_CW = 1;

	configura_relogio();

	while(1){
		if (botao == 1) servo = 180;
		if (botao == 0) servo = 0;
	}
}

14.2 Arquivo Secundário

// acrescentar ao iniciog.h ou arquivo pratica.h

void habilita_ponteh(){
	MOTOR_AB_EN = 1;
	MTR1_EN = 1;
	MTR2_EN = 1;
}

void servo0();
void servo90();
void servo180();

int t = 0;
int servo = 1;

void servo0()
{
	//1,0ms
	for (t = 0; t < 425; t++)
	{
		led = 1;
		MTR1_CC = 1;
		MTR2_CC = 1;
	}
}

void servo90()
{
	//1,5ms
	for (t = 0; t < 600; t++)
	{
		led = 1;
		MTR1_CC = 1;
		MTR2_CC = 1;
	}
}

void servo180()
{
	//2,0ms
	for (t = 0; t < 818; t++)
	{
		led = 1;
		MTR1_CC = 1;
		MTR2_CC = 1;
	}
}

void configura_relogio(){
	T0CON = 0x80; //20s
	INTCON = 0b10100000;
	TMR0H = 0x15; //20ms
	TMR0L = 0xA0; //20ms
}

#pragma code int_pr = 0x1848
#pragma interrupt trata_timer0

void trata_timer0(void)
{
	if (servo == 0 ) servo0();
	if (servo == 90 ) servo90();
	if (servo == 180 ) servo180();
	INTCONbits.TMR0IF = 0;
	TMR0H = 0x15; //20ms
	TMR0L = 0xA0; //20ms
	led = 0;
	MTR1_CC = 0;
	MTR2_CC = 0;
}