- Servo motor
- Controlando o servo motor usando LPC2148 PWM e ADC
- Pinos PWM e ADC em ARM7-LPC2148
- Componentes necessários
- Diagrama de circuito e conexões
- Programação ARM7-LPC2148 para controle de servo motor
Em nosso tutorial anterior, conectamos o motor de passo com o ARM7-LPC2148. Neste tutorial, controlaremos o Servo Motor com ARM7-LPC2148. O servo motor tem vantagem de baixo consumo de energia em relação ao motor de passo. Um servo motor interrompe seu consumo de energia quando a posição desejada é alcançada, mas o motor de passo continua a consumir energia para travar o eixo na posição desejada. Servo motores são usados principalmente em projetos de robótica devido à sua precisão e fácil manuseio.
Neste tutorial, aprenderemos sobre Servo Motor e como fazer a interface do Servo com ARM7-LPC2148. Um potenciômetro também é conectado para variar a posição do eixo do servo motor e um LCD para exibir o valor do ângulo.
Servo motor
Um servo motor é uma combinação de motor DC, sistema de controle de posição e engrenagens. A rotação do servo motor é controlada pela aplicação de um sinal PWM a ele, a largura do sinal PWM decide o ângulo de rotação e a direção do motor. Aqui estaremos usando o Servo Motor SG90 neste tutorial, é um dos mais populares e mais baratos. SG90 é um servo de 180 graus. Então, com este servo, podemos posicionar o eixo de 0-180 graus:
- Tensão operacional: + 5V
- Tipo de engrenagem: plástico
- Ângulo de rotação: 0 a 180 graus
- Peso: 9gm
- Torque: 2,5kg / cm
Antes de iniciarmos a programação do Servo motor, devemos saber que tipo de sinal deve ser enviado para o controle do Servo motor. Devemos programar o MCU para enviar sinais PWM ao fio de sinal do servo motor. Existe um circuito de controle dentro do servo motor que lê o ciclo de trabalho do sinal PWM e posiciona o eixo dos servo motores no respectivo local conforme mostrado na imagem abaixo
A cada 20 milissegundos, o servo motor verifica o pulso. Portanto, ajuste a largura de pulso do sinal para girar o eixo do motor.
- Largura de pulso de 1 ms (1 milissegundo) para rotação do servo a 0 grau
- Largura de pulso de 1,5 ms para rotação de 90 graus (posição neutra)
- Largura de pulso de 2 ms para rotação do servo a 180 graus.
Antes de conectar o servo ao ARM7-LPC2148, você pode testar o seu servo com a ajuda deste circuito testador do servo motor. Verifique também como um servo motor pode interagir com outros microcontroladores:
- Controle servo motor usando Arduino
- Interface Servo Motor com Microcontrolador 8051
- Controle servo motor usando MATLAB
- Controle servo motor com Raspberry Pi
- Servo motor de interface com MSP430G2
- Servo motor de interface com STM32F103C8
Controlando o servo motor usando LPC2148 PWM e ADC
Um servo motor pode ser controlado por LPC2148 usando PWM. Fornecendo o sinal PWM ao pino PWM do SERVO com um período de 20ms e frequência de 50Hz, podemos posicionar o eixo do servo motor em cerca de 180 graus (-90 a +90).
Um potenciômetro é usado para variar o ciclo de trabalho do sinal PWM e girar o eixo do servo motor, este método é implementado usando o módulo ADC em LPC2148. Portanto, precisamos que os conceitos de PWM e ADC sejam implementados neste tutorial. Portanto, por favor, consulte nossos tutoriais anteriores para aprender PWM e ADC em ARM7-LPC2148.
- Como usar PWM em ARM7-LPC2148
- Como usar ADC em ARM-LPLC2148
Pinos PWM e ADC em ARM7-LPC2148
A imagem abaixo mostra os pinos PWM e ADC em LPC2148. As caixas amarelas indicam os (6) pinos PWM e a caixa preta indica os (14) pinos ADC.
Componentes necessários
Hardware
- ARM7-LPC2148
- Módulo de exibição LCD (16x2)
- Servo motor (SG-90)
- Regulador de tensão de 3,3 V
- Potenciômetro de 10k (2 Nos)
- Tábua de pão
- Fios de conexão
Programas
- Keil uVision5
- Ferramenta Flash Magic
Diagrama de circuito e conexões
A tabela abaixo mostra a conexão entre servo motor e ARM7-LPC2148:
SERVO PINS |
ARM7-LPC2148 |
VERMELHO (+ 5V) |
+ 5V |
MARROM (GND) |
GND |
LARANJA (PWM) |
P0.1 |
O pino P0.1 é a saída PWM do LPC2148.
A tabela abaixo mostra as conexões de circuito entre LCD e ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Seleção de Registro) |
P0.6 |
E (habilitar) |
P0,12 |
D4 (dados pino 4) |
P0.13 |
D5 (pino de dados 5) |
P0.14 |
D6 (pino de dados 6) |
P0.15 |
D7 (dados pino 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
A tabela abaixo mostra as conexões entre o ARM7 LPC2148 e o potenciômetro com regulador de tensão de 3,3V.
IC regulador de tensão de 3,3 V |
Função de pino |
Pin ARM-7 LPC2148 |
1. Pino esquerdo |
- Ve do GND |
PIN GND |
2. Pino central |
Saída regulada de + 3,3 V |
Para a entrada do potenciômetro e a saída do potenciômetro para P0.28 de LPC2148 |
3. Pino direito |
+ Ve de 5V ENTRADA |
+ 5V |
Pontos a serem anotados
1. Um regulador de tensão de 3,3 V é usado aqui para fornecer o valor de entrada analógica para o pino ADC (P0.28) do LPC2148. Como estamos usando alimentação de 5V, precisamos regular a tensão com regulador de tensão de 3,3V
2. Um potenciômetro é usado para variar a tensão entre (0V a 3,3V) para fornecer entrada analógica (ADC) para o pino P0.28 do LPC2148
3. O pino P0.1 do LPC2148 fornece saída PWM para o servo motor para controlar a posição do motor.
4. De acordo com o valor da entrada analógica (ADC), a posição do servo motor muda de (0 a 180 graus) através do pino de saída PWM em P0.1 de LPC2148.
Programação ARM7-LPC2148 para controle de servo motor
Para programar o ARM7-LPC2148, precisamos da ferramenta Keil uVision e Flash Magic. Estamos usando o cabo USB para programar o ARM7 Stick via porta micro USB. Nós escrevemos código usando Keil e criamos um arquivo hexadecimal e então o arquivo HEX é enviado para o stick ARM7 usando Flash Magic. Para saber mais sobre como instalar keil uVision e Flash Magic e como usá-los, siga o link Getting Started With ARM7 LPC2148 Microcontroller e programe-o usando Keil uVision.
Etapas envolvidas na configuração do LPC2148 para PWM e ADC para controlar o servo motor
Etapa 1: - Incluir os arquivos de cabeçalho necessários para a codificação LPC2148
#incluir
Etapa 2: - O próximo passo é configurar o PLL para geração de relógio, pois ele define o relógio do sistema e o relógio periférico do LPC2148 de acordo com a necessidade do programador. A frequência máxima do relógio para LPC2148 é 60Mhz. As linhas a seguir são usadas para configurar a geração do relógio PLL.
void initilizePLL (void) // Função para usar PLL para geração de relógio { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; enquanto (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Etapa 3: - A próxima coisa a fazer é selecionar os pinos PWM e a função PWM do LPC2148 usando o registro PINSEL. Usamos PINSEL0 como usamos P0.1 para saída PWM de LPC2148.
PINSEL0 - = 0x00000008; // Definindo o pino P0.1 de LPC2148 como PWM3
Passo 4: - Em seguida, precisamos RESETAR os timers usando PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Reinicialize e desabilite o contador para PWM
Em seguida, defina o valor predefinido que decide se a resolução de PWM é definida.
PWMPR = 0x1D; // Valor do registro de pré-escala
Etapa 5: - Em seguida, defina o PWMMCR (registro de controle de correspondência PWM), pois ele define a operação como reset, interrupções para PWMMR0 e PWMMR3.
PWMMCR = 0x00000203; // Reinicializar e interromper na partida MR0, interromper na partida MR3
Etapa 6: - O período máximo do canal PWM é definido usando PWMMR0 e a tonelada do ciclo de trabalho PWM é inicialmente definido para 0,65 mseg
PWMMR0 = 20000; // Período de tempo da onda PWM, 20 mseg PWMMR3 = 650; // Tonelada de onda PWM 0,65 mseg
Etapa 7: - Em seguida, precisamos definir o Latch Enable para os registros de correspondência correspondentes usando PWMLER
PWMLER = 0x09; // Habilitar trava para PWM3 e PWM0
(Usamos PWMMR0 e PWMMR3) Portanto, habilite o bit correspondente configurando 1 em PWMLER
Etapa 8: - Para habilitar a saída PWM para o pino, precisamos usar o PWMTCR para habilitar os contadores do temporizador PWM e os modos PWM.
PWMPCR = 0x0800; // Habilita PWM3 e PWM 0, PWM controlado por borda única PWMTCR = 0x09; // Habilita PWM e contador
Passo 9: - Agora precisamos obter os valores do potenciômetro para definir o ciclo de trabalho do PWM do pino P0.28 do ADC. Portanto, usamos o módulo ADC no LPC2148 para converter a entrada analógica dos potenciômetros (0 a 3,3 V) para os valores do ADC (0 a 1023).
Etapa 10: - Para selecionar o pino ADC P0.28 em LPC2148, usamos
PINSEL1 = 0x01000000; // Configurando P0.28 como ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Configurando o relógio e PDN para conversão A / D
As linhas a seguir capturam a entrada analógica (0 a 3,3 V) e a convertem em valor digital (0 a 1023). E então esses valores digitais são divididos por 4 para convertê-los em (0 a 255) e finalmente alimentados como saída PWM no pino P0.1 do LPC2148. Aqui, estamos convertendo os valores de 0-1023 para 0-255 dividindo-o com 4, pois o PWM de LPC2148 tem resolução de 8 bits (28).
AD0CR - = (1 << 1); // Seleciona o canal AD0.1 no registro ADC delaytime (10); AD0CR - = (1 << 24); // Iniciar a conversão A / D while ((AD0DR1 & (1 << 31)) == 0); // Verifique o bit DONE no registro de dados ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Pega o RESULTADO do registro de dados ADC dutycycle = adcvalue / 4; // fórmula para obter os valores do ciclo de serviço de (0 a 255) PWMMR1 = ciclo de serviço; // definir o valor do ciclo de dever para o registro de correspondência PWM PWMLER - = (1 << 1); // Habilita a saída PWM com o valor do ciclo de trabalho
Etapa 11: - A seguir, exibimos esses valores no módulo de exibição LCD (16X2). Portanto, adicionamos as seguintes linhas para inicializar o módulo de display LCD
Void LCD_INITILIZE (void) // Função para preparar o LCD { IO0DIR = 0x0000FFF0; // Define os pinos P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 como tempo de retardo de SAÍDA (20); LCD_SEND (0x02); // Inicializa o LCD no modo de operação de 4 bits LCD_SEND (0x28); // 2 linhas (16X2) LCD_SEND (0x0C); // Exibe o cursor desligado LCD_SEND (0x06); // Cursor de incremento automático LCD_SEND (0x01); // Mostra limpar LCD_SEND (0x80); // Primeira linha, primeira posição }
Como conectamos o LCD no modo de 4 bits com o LPC2148, precisamos enviar valores a serem exibidos como nibble a nibble (Upper Nibble e Lower Nibble). Portanto, as seguintes linhas são usadas.
void LCD_DISPLAY (char * msg) // Função para imprimir os caracteres enviados um a um { uint8_t i = 0; enquanto (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Envia o nibble superior IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH para imprimir os dados IO0CLR = 0x00000020; // RW LOW Modo de gravação delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS e RW inalterados (ou seja, RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Envia o nibble inferior IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; tempo de atraso (2); IO0CLR = 0x00000040; tempo de atraso (5); i ++; } }
Para exibir esses valores ADC e PWM, usamos as seguintes linhas na função int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", ciclo de dever); LCD_DISPLAY (displayadc); // Exibir valor ADC (0 a 1023) angle = (adcvalue / 5.7); // Fórmula para converter o valor ADC em ângulo (o a 180 graus) LCD_SEND (0xC0); sprintf (anglevalue, "ANGLE =%. 2f deg", ângulo); LCD_DISPLAY (anglevalue);
O código completo e a descrição do vídeo do tutorial são fornecidos abaixo