====== 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); } }