Controle de Motor com Microcontrolador 8051 utilizando Botões

Em sistemas baseados no microcontrolador 8051, a interface de botões é fundamental para a interação do usuário. Os botões podem ser conectados de forma independente ou em matriz, utilizando portas GPIO específicas. No STC89C52, as portas P3^0 a P3^3 são frequentemente utilizadas para essa finalidade.

O princípio de detecção baseia-se na variação de nível lógico: em repouso, a porta permanece em nível alto através de um resistor de pull-up; quando o botão é pressionado, a porta é levada ao nível baixo. Esse mecanismo permite que o microcontrolador detecte a ação do usuário.

Devido às características mecânicas dos botões, ocorre o fenômeno de bouncing. Para mitigar esse problema, utiliza-se a técnica de debounce por software, que consiste em aguardar um curto período após a primeira detecção e verificar novamente o estado do botão, eliminando leituras falsas.

Interface do Motor

O microcontrolador 8051 não possui capacidade direta de acionamento de motores de alta potência. Por isso, é necessário utilizar circuitos drivers que convertem sinais de baixa corrente em sinais adequados para acionamento de cargas maiores.

Tipo de Pino Exemplo Função
Saída digital P3^0, P3^1 Controle de partida/parada e direção
Saída PWM P1.0–P1.7 Regulação de velocidade

Motores DC não possuem polaridade fixa, mas a inversão das conexões resulta na inversão do sentido de rotação, o que pode ser explorado conforme a necessidade da aplicação.

Inicialização do Sistema

A fase de inicialização configura os registradores e portas necessárias para o funiconamento do controle de motor. Os principais elementos são:

Configuração de Registradores

O registrador TMOD define o modo de operação do temporizador:

TMOD = 0x10; // Temporizador 1 no modo 1 (16 bits)

O registrador TCON controla o início e as interrupções:

TF1 = 0; // Limpa flag de interrupção
TR1 = 1; // Inicia temporizador 1

Configuração da comunicação serial via SCON:

SCON = 0x50; // Serial modo 1, 8 bits de dados

Configuração de Interrupções

Habilitação da interrupção global:

EA = 1;

Definição de prioridade:

IP = 0x08; // Temporizador 1 com alta prioridade

Configuração de GPIO

Configuração da porta P1 como saída:

P1 = 0x00; // Inicializa P1 em nível baixo

Controle por Botões

A lógica de controle de botões gerencia as operações de partida, parada e inversão do motor. Uma implementação típica:

Definição dos pinos dos botões:

sbit BTN_START  = P3^0;
sbit BTN_STOP   = P3^1;
sbit BTN_REVERSE = P3^2;

Função de varredura com debounce:

unsigned char ler_botoes(void)
{
    if (BTN_START == 0)
    {
        atraso_ms(15);
        if (BTN_START == 0) return 1;
    }
    if (BTN_STOP == 0)
    {
        atraso_ms(15);
        if (BTN_STOP == 0) return 2;
    }
    if (BTN_REVERSE == 0)
    {
        atraso_ms(15);
        if (BTN_REVERSE == 0) return 3;
    }
    return 0;
}

Loop principal de processamento:

while (1)
{
    unsigned char cmd = ler_botoes();

    switch (cmd)
    {
        case 1:
            ligar_motor();
            break;
        case 2:
            desligar_motor();
            break;
        case 3:
            inverter_motor();
            break;
        default:
            break;
    }
}

Funções de controle do motor:

void ligar_motor(void)
{
    // Ativa saída PWM e liga o motor
}

void desligar_motor(void)
{
    // Desativa saída PWM e para o motor
}

void inverter_motor(void)
{
    // Inverte o sentido de rotação
}

Controle de Velocidade via PWM

A regulação de velocidade do motor depende da geração de um sinal PWM preciso. O temporizador do 8051 é utilizado para criar esse sinal.

Geração do Sinal PWM

Configuração do temporizador 0 no modo 1:

TMOD |= 0x01; // Temporizador 0, modo 16 bits

Definição dos valores de recarga:

TH0 = 0xFC; // Valor alto
TL0 = 0x18;  // Valor baixo

Ativação do temporizador e interrupções:

TR0 = 1;  // Inicia temporizador 0
ET0 = 1;  // Habilita interrupção do temporizador 0
EA  = 1;  // Habilita interrupções globais

Controle de Duty Cycle

Uma variável global armazena o duty cycle atual e a interrupção ajusta a saída:

unsigned char contador_pwm = 0;
unsigned char ciclo_ativo   = 50; // 50% inicial

void isr_timer0(void) interrupt 1
{
    TH0 = 0xFC;
    TL0 = 0x18;

    contador_pwm++;

    if (contador_pwm < ciclo_ativo)
        P1_2 = 1; // Nível alto
    else
        P1_2 = 0; // Nível baixo

    if (contador_pwm >= 100)
        contador_pwm = 0;
}

Ajuste por Botões

Botões adicionais controlam o aumento e a diminuição do duty cycle:

if (botao_acelerar_pressionado())
{
    ciclo_ativo += 5;
    if (ciclo_ativo > 100) ciclo_ativo = 100;
}

if (botao_desacelerar_pressionado())
{
    if (ciclo_ativo >= 5)
        ciclo_ativo -= 5;
}

Atualização de Display

Um display LCD1602 pode exibir o duty cycle e a velocidade do motor:

void atualizar_lcd(void)
{
    lcd_posicao(0, 0);
    lcd_string("Ciclo: ");
    lcd_inteiro(ciclo_ativo);
    lcd_string("%");

    lcd_posicao(0, 1);
    lcd_string("RPM: ");
    lcd_inteiro(calcular_rpm());
}

Ferramentas de Simulação

No desenvolvimento de projetos com o 8051, as seguintes ferramentas são amplamente utilizadas:

  1. Proteus: simulação de circuitos com suporte completo à família 8051, oferecendo biblioteca extensa de componentes e interface gráfica para prototipação rápida.
  2. Keil uVision: IDE para compilação e depuração de código C e Assemb, com funcionalidades básicas de simulação integrada.
  3. MATLAB/Simulink: modelagem matemática avançada, com integração via S-functions ou Embedded Coder para geração de código compatível.

Montagem do Circuito

A montagem física do circuito envolve os seguintes componentes principais:

  1. Microcontrolador: STC89C51/52 como unidade central de processamento, com portas I/O e temporizadores integrados.
  2. Driver de motor: CI MX1508 (ponte H dupla), com proteção térmica e contra curto-circuito, ideal para motores DC de pequeno e médio porte.
  3. Regulador de tensão: AMS1117 para fornecer alimentação estável de 3.3V ou 5V ao circuito driver.
  4. Display: OLED SSD1306 para visualização de parâmetros como velocidade e duty cycle.
  5. Sensores: sensor Hall para medição não-contactada da rotação do motor.

Esquema de conexões:

+------------------+        +------------+
| STC89C52         |        | MX1508     |
|------------------|        |------------|
| P1.0 ---+--------| IN1   |            |
| P1.1 ---+--------| IN2   |            |
| VCC ----|--------| VCC   |            |
| GND ----|--------| GND   |            |
+------------------+        +------------+

+------------+      +-------------+
| SSD1306    |      | AMS1117     |
|------------|      |-------------|
| SDA -------|      |             |
| SCL -------|      |             |
| VCC -------|      | VCC         |
| GND -------|      | GND         |
+------------+      +-------------+

Análise do Código-Exemplo

O trecho a seguir demonstra um controle simples de liga/desliga do motor com um único botão:

sbit MOTOR_PIN = P1^0; // Motor ligado ao pino P1.0

void main(void)
{
    MOTOR_PIN = 0; // Motor inicialmente parado

    while (1)
    {
        if (P3_1 == 0)           // Verifica se o botão foi pressionado
        {
            atraso_ms(20);      // Debounce
            if (P3_1 == 0)      // Confirma o pressionamento
            {
                MOTOR_PIN = !MOTOR_PIN; // Inverte o estado do motor
            }
            while (P3_1 == 0) {} // Aguarda o botão ser solto
        }
    }
}

O funcinoamento do código segue esta lógica:

  1. Inicialização: o motor é definido como desligado ao iniciar.
  2. Detecção de pressionamento: o estado do pino P3_1 é verificado; se estiver em nível baixo, indica que o botão foi pressionado.
  3. Debounce: um atraso de 20 ms é aplicado e o estado é verificado novamente para confirmar a leitura.
  4. Alternância de estado: o operador ! inverte o estado atual do pino do motor, alternando entre ligado e desligado.
  5. Espera de liberação: o loop while (P3_1 == 0) mantém o programa parado até que o botão seja solto, evitando múltiplas leituras de uma única pressão.

Pontos Técnicos Fundamentais

  • Geração de PWM: controle preciso da velocidade através da interrupção do temporizador.
  • Debounce de botões: dupla verificação com atraso para eliminação de ruídos elétricos.
  • Alternância de estado: uso do operador lógico NOT para alternar entre ligado e desligado de forma eficiente.
  • Interrupções: garantem resposta rápida a eventos externos e temporizados, melhorando a reatividade do sistema.

Tags: 8051 STC89C52 PWM motor-DC debounce

Publicado em 10-14 20:52