====== Motores ======
//Relacionado com: [HW] [[pt:hardware:homelab:motor]]//
Esta biblioteca contém funções para controlar diferentes motores no HomeLab. Existem funções para motores DC, stepper e servomotores.
===== Tipos =====
* **//prescale//** \\ Enumeração de tipos de prescaler de relógios PWM. Determina o factor de divisão do sistema de relógio. É recomendado o uso dos dois primeiros factores de divisão. Opções:
* //TIMER2_NO_PRESCALE// - Sem uso de factor de divisão.
* //TIMER2_PRESCALE_8// - Factor de divisão 8.
* //TIMER2_PRESCALE_64// - Factor de divisão 64.
* //TIMER2_PRESCALE_256// - Factor de divisão 256.
* //TIMER2_PRESCALE_1024// - Factor de divisão 1024.
===== Funções =====
* **//void dcmotor_init(unsigned char index)//** \\
Inicializa um dos controladores de motor DC. Parâmetros:
* //index// - Indíce do controlador do motor. 0 a 3.
* **//void dcmotor_drive(unsigned char index, signed char direction)//** \\
Alimenta um dos controladores de motor DC. Parâmetros:
* //index// - Indíce do controlador do motor. 0 a 3.
* //direction// - Polaridade do motor. -1, 0 ou +1. No caso do 0 o motor é parado, caso contrário o motor é accionado na direcção dada.
* **//void dcmotor_drive_pwm_init(unsigned char index, timer2_prescale prescaler)//** \\ Inicializa um dos controladores de motor DC para controlo de velocidade. Adicionalmente, pode definir-se um prescaler adequado, dependendo da frequência do PWM que se precisa. Parâmetros:
* //index// - Indíce do controlador do motor. 0 a 3.
* //prescaler// - Selecção do prescaler do relógio. As interrupções podem ocorrer de forma muito rápida e perturbar o programa. Por exemplo, quando sensor UH é usado, é necessário configurar o prescaler para TIMER2_PRESCALE_8.
* **//void dcmotor_drive_pwm(unsigned char index, signed char direction, unsigned char speed) //** \\
Alimenta um dos controladores de motor DC. O motor roda numa dada direcção e velocidade Parâmetros:
* //index// - Indíce do controlador do motor. 0 a 3.
* //direction// - Polaridade do motor. -1 ou +1.
* //speed// - Velocidade do motor. 0 a 255. Para 0 o motor pára e para 255 o motor está na velocidade máxima.
* **//void unipolar_init(unsigned char index)//** \\
Inicializa o controlador de um dos motores stepper. Parâmetros:
* //index// - Indíce do controlador do motor. 0 ou 1.
* **//void unipolar_halfstep(unsigned char index, signed char direction, unsigned short num_steps, unsigned char speed)//** \\
Comando de meio passo para um motor stepper unipolar. Esta função bloqueia o processador até os passos estarem concluídos. Parâmetros:
* //index// - Indíce do controlador do motor. 0 ou 1.
* //direction// - Direcção de rotação. -1 ou +1.
* //num_steps// - Contagem de meios passos.
* //speed// - Tempo de um passo em milisegundos.
* **//void bipolar_init(void)//** \\
Inicializa o controlador de um motor stepper bipolar.
* **//void bipolar_halfstep(signed char direction, unsigned short num_steps, unsigned char speed)//** \\
Comando de meio passo para um motor stepper bipolar. Esta função bloqueia o processador até os passos estarem concluídos. Parâmetros:
* //direction// - Direcção de rotação. -1 ou +1.
* //num_steps// - Contagem de meios passos.
* //speed// - Tempo de um passo em milisegundos.
* **//void servomotor_init(unsigned char index)//** \\
Inicializa as unidades de geração de sinal PWM de um servomotor no timer 1 do ATmega128. O sinal PWM é de 50 hz com período elevado a 1.5 ms ± 0.5 ms. Parâmetros::
* //index// - Indíce do servomotor. 0 ou 1.
* **//void servomotor_position(unsigned char index, signed short position)//** \\
Comando de controlo da largura do pulso do servomotor. Se o posicionamento do servomotor é executado, a sua posição é alterada, se é rodado, a sua velocidade de rotação é alterada. Parâmetros:
* //index// - Indíce do servomotor. 0 ou 1.
* //position// - Posição ou velocidade de rotação. -100 a +100. 0 corresponde a paragem.
===== Exemplo =====
O programa seguinte demonstra o uso de motores DC, stepper e servomotores.
#include
int main(void)
{
// DC motors initialization.
dcmotor_init(0);
dcmotor_init(1);
// Bipolar stepper initialization.
bipolar_init();
// Servo motors initialization.
servomotor_init(0);
servomotor_init(1);
// One DC motors drives forward, another in backward direction.
dcmotor_drive(0, -1);
dcmotor_drive(1, +1);
// Rotating the stepper motor 100 steps in one direction
// and then back with twice the speed.
bipolar_halfstep(1, 100, 50);
bipolar_halfstep(-1, 100, 25);
// Rotating servo motors in opposite directions.
servomotor_position(0, -100);
servomotor_position(1, +100);
}
Este exemplo demonstra o ajustamento da velocidade para um motor DC.
#include
int main(void)
{
unsigned char speed = 0;
// DC motors initialization
dcmotor_drive_pwm_init(0, TIMER2_NO_PRESCALE);
while(1)
{
speed = 100;
// DC motors drives predefined speed and direction.
dcmotor_drive_pwm(0, 1, speed);
}
}