Este artigo examina os componentes técnicos essenciais de um controlador de servo industrial fabricado em série, focando na arquitetura de software e nos detalhes do projeto de hardware. O sistema utiliza uma DSP TMS320F28335 para controle principal, auxiliada por um FPGA da Lattice para processamento paralelo.
Implementação de Software
1. Firmware da DSP em C
A lógica principal de controle reside no firmware C para a DSP. Um aspecto crucial é a rotina de calibração automática do motor, que determina seus parâmetros elétricos. O código abaixo ilustra uma abordagem estruturada para isso:
// Estrutura para armazenar parâmetros do motor identificados
typedef struct {
float R_s; // Resistência do estator
float L_s; // Indutância do estator
unsigned int pares_polos; // Número de pares de polos
} ServoMotorParams;
// Rotina principal de calibração do motor
ServoMotorParams calibrateMotorParams(void) {
ServoMotorParams parametros_calibrados;
// Sequência de medições controladas
parametros_calibrados.R_s = medir_resistencia_dc();
parametros_calibrados.L_s = determinar_indutancia_fase();
parametros_calibrados.pares_polos = inferir_pares_polos_via_encoder();
return parametros_calibrados;
}
Funções como medir_resistencia_dc interagem diretamente com o hardware analógico para injetar correntes de teste e ler as tensões resultantes através do conversor AD.
2. Lógica Sequencial em VHDL para o FPGA
O FPGA, programado em VHDL, assume tarefas que requerem determinismo temporal preciso, como o tratamento de sinais do encoder. Um módulo simples de registro de deslocamento para a leitura serial do encoder pode ser definido assim:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity registrador_serie_encoder is
Port (
sinal_clk : in STD_LOGIC;
sinal_reset : in STD_LOGIC;
dado_serie : in STD_LOGIC;
carga_paralela : in STD_LOGIC;
saida_paralela : out STD_LOGIC_VECTOR (11 downto 0)
);
end registrador_serie_encoder;
architecture comportamento of registrador_serie_encoder is
signal reg_interno : STD_LOGIC_VECTOR (11 downto 0) := (others => '0');
begin
process(sinal_clk, sinal_reset)
begin
if sinal_reset = '1' then
reg_interno <= (others => '0');
elsif rising_edge(sinal_clk) then
if carga_paralela = '1' then
reg_interno <= dado_serie & reg_interno(11 downto 1);
end if;
end if;
end process;
saida_paralela <= reg_interno when carga_paralela = '0' else (others => 'Z');
end comportamento;
Este módulo desloma os bits recebidos serialmente (dado_serie) em cada borda de subida do clock, permitindo a leitura paralela da posição do encoder após 12 ciclos.
Projeto de Hardware
1. Condicionamento do Sinal e Conversão AD
O circuito de Condicionmaento de Sinal Analógico (AD) é fundamental para converter correntes de fase e tensões do barramento em sinais digitais compatíveis com a faixa de entrada da DSP. A precisão de 12 bits e a taxa de amostragem sincronizada com a modulação PWM são críticas para um controle de torque preciso.
2. Projeto da Placa de Circuito Impresso (PCB)
A arquitetura de hardware é dividida em três PCBs principais:
- Placa de Controle Principal: Aloca a DSP, o FPGA, circuitos de memória e interfaces de comunicação (CAN, RS485).
- Placa de Acionamento (Drivetrain): Implementa o inversor trifásico com módulos IGBT ou MOSFET, circuitos de gate driver e sensores de corrente (shunt ou Hall). O projeto térmico e a minimização de indutâncias parasitas são desafios chave.
- Placa de Interface: Gerencia a comunicação com o operador e pode incluir um display e teclas.
O roteamento da PCB da placa de acionamento exige atenção especial à separação entre as áreas de sinal de controle e de potência, além de um plano de aterramento robusto para mitigar interferências eletromagnéticas.
Algoritmos de Controle e Comunicação
1. Supressão de Vibração de Baixa Frequência
Para mitigar resssonâncias mecânicas, um filtro notch (rejeita-faixa) é frequentemente implementado no loop de feedback de velocidade. Uma implementação discreta pode ser adaptada conforme a frequência de ressonância medida:
// Parâmetros de um filtro Notch de 2ª ordem
#define W0 2.0f * PI * 150.0f // Frequência de ressonância (rad/s)
#define Q 10.0f // Fator de qualidade
#define TS 0.0001f // Período de amostragem (10kHz)
// Coeficientes calculados (exemplo)
float b[3] = {1.0f, -1.95f, 0.98f};
float a[3] = {1.0f, -1.86f, 0.87f};
// Histórico do filtro
static float historico_entrada[2] = {0};
static float historico_saida[2] = {0};
float aplicar_filtro_notch(float sinal_entrada) {
float saida_filtrada = b[0]*sinal_entrada
+ b[1]*historico_entrada[0]
+ b[2]*historico_entrada[1]
- a[1]*historico_saida[0]
- a[2]*historico_saida[1];
// Atualizar histórico
historico_entrada[1] = historico_entrada[0];
historico_entrada[0] = sinal_entrada;
historico_saida[1] = historico_saida[0];
historico_saida[0] = saida_filtrada;
return saida_filtrada;
}
2. Pilhas de Protocolo de Comunicação
A capacidade de se integrar em redes industriais é essencial. O firmware inclui uma pilha para o protocolo MODBUS RTU. O tratamento de uma solicitação de leitura de registradores (Function Code 0x03) envolve a decodificação do frame, o acesso à memória de dados e a montagem da resposta com o CRC correto.
O pacote completo de design inclui documentação detalhada dos esquemáticos, layouts de PCB validados e o firmware fonte, formando uma base sólida para estudo e desenvolvimento de soluções de controle de movimento de alta performance. A correta integração e validação de todos estes subsistemas é o que viabiliza a produção em escala.