Índice:

Microcontrolador AVR. Modulação por largura de pulso. Controlador de motor DC e intensidade de luz LED: 6 etapas
Microcontrolador AVR. Modulação por largura de pulso. Controlador de motor DC e intensidade de luz LED: 6 etapas

Vídeo: Microcontrolador AVR. Modulação por largura de pulso. Controlador de motor DC e intensidade de luz LED: 6 etapas

Vídeo: Microcontrolador AVR. Modulação por largura de pulso. Controlador de motor DC e intensidade de luz LED: 6 etapas
Vídeo: Learn Arduino in 30 Minutes: Examples and projects 2024, Novembro
Anonim
Image
Image

Olá pessoal!

A modulação por largura de pulso (PWM) é uma técnica muito comum em telecomunicações e controle de energia. é comumente usado para controlar a energia fornecida a um dispositivo elétrico, seja um motor, um LED, alto-falantes, etc. É basicamente uma técnica de modulação, na qual a largura do pulso da portadora varia de acordo com o sinal de mensagem analógico.

Nós fazemos um circuito elétrico simples para controlar a velocidade de rotação do motor DC em função da intensidade da luz. Usaremos recursos de resistor dependente de luz e microcontrolador AVR, como conversão analógica para digital, para medir a intensidade da luz. Além disso, usaremos o Módulo de acionamento do motor Dual H-Bridge-L298N. É normalmente usado no controle de velocidade e direção de motores, mas pode ser usado para outros projetos, como direcionar o brilho de certos projetos de iluminação. Além disso, adicionamos um botão ao nosso circuito para alternar a direção de rotação do motor.

Etapa 1: Descrição

Descrição
Descrição
Descrição
Descrição

Cada corpo neste mundo tem alguma inércia. O motor gira sempre que é ligado. Assim que for desligado, ele tenderá a parar. Mas não para imediatamente, leva algum tempo. Mas antes que ele pare completamente, ele é ligado novamente! Assim, ele começa a se mover. Mas mesmo agora, leva algum tempo para atingir sua velocidade total. Mas antes que isso aconteça, ele é desligado e assim por diante. Assim, o efeito geral dessa ação é que o motor gira continuamente, mas a uma velocidade menor.

A modulação por largura de pulso (PWM) é uma técnica de comutação de energia comparativamente recente para fornecer quantidades intermediárias de energia elétrica entre níveis totalmente ligados e totalmente desligados. Normalmente, os pulsos digitais têm o mesmo período de tempo ligado e desligado, mas em algumas situações precisamos que o pulso digital tenha mais / menos tempo ligado / desligado. Na técnica PWM, criamos pulsos digitais com uma quantidade desigual de estado ligado e desligado para obter os valores de tensão intermediários necessários.

O ciclo de trabalho é definido pela porcentagem da duração da alta tensão em um pulso digital completo. Pode ser calculado por:

% do ciclo de trabalho = T on / T (período de tempo) x 100

Vamos fazer uma declaração do problema. Precisamos gerar um sinal PWM de 50 Hz com ciclo de trabalho de 45%.

Frequência = 50 Hz

Período de tempo, T = T (ligado) + T (desligado) = 1/50 = 0,02 s = 20 ms

Ciclo de trabalho = 45%

Assim, resolvendo de acordo com a equação dada acima, obtemos

T (ligado) = 9 ms

T (desligado) = 11 ms

Etapa 2: Temporizadores AVR - Modo PWM

Temporizadores AVR - Modo PWM
Temporizadores AVR - Modo PWM
Temporizadores AVR - Modo PWM
Temporizadores AVR - Modo PWM

Para fazer PWM, AVR contém hardware separado! Ao usar isso, a CPU instrui o hardware a produzir PWM de um ciclo de trabalho específico. O ATmega328 tem 6 saídas PWM, 2 estão localizadas no temporizador / contador 0 (8 bits), 2 estão localizadas no temporizador / contador 1 (16 bits) e 2 estão localizadas no temporizador / contador 2 (8 bits). Timer / Counter0 é o dispositivo PWM mais simples no ATmega328. Timer / Counter0 é capaz de funcionar em 3 modos:

  • PWM rápido
  • PWM com correção de fase e frequência
  • PWM com correção de fase

cada um desses modos pode ser invertido ou não invertido.

Inicialize o Timer0 no modo PWM:

TCCR0A | = (1 << WGM00) | (1 << WGM01) - configurar WGM: Fast PWM

TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - configurar o modo de saída de comparação A, B

TCCR0B | = (1 << CS02) - configurar temporizador com prescaler = 256

Etapa 3: Medição da intensidade da luz - ADC e LDR

Medição da intensidade da luz - ADC e LDR
Medição da intensidade da luz - ADC e LDR
Medição da intensidade da luz - ADC e LDR
Medição da intensidade da luz - ADC e LDR
Medição da intensidade da luz - ADC e LDR
Medição da intensidade da luz - ADC e LDR

O Resistor Dependente de Luz (LDR) é um transdutor que muda sua resistência quando a luz incide em sua superfície.

Os LDRs são feitos de materiais semicondutores para permitir que tenham suas propriedades sensíveis à luz. Esses LDRs ou RESISTORES DE FOTOGRAFIA funcionam com base no princípio de “Fotocondutividade”. Agora, o que este princípio diz é que sempre que a luz incide na superfície do LDR (neste caso), a condutância do elemento aumenta ou, em outras palavras, a resistência do LDR diminui quando a luz incide na superfície do LDR. Esta propriedade de diminuição da resistência para o LDR é alcançada porque é uma propriedade do material semicondutor usado na superfície. LDR são usados na maioria das vezes para detectar a presença de luz ou para medir a intensidade da luz.

Para transferir informações externas contínuas (informações analógicas) para um sistema digital / computacional, devemos convertê-las em valores inteiros (digitais). Este tipo de conversão é realizado por Conversor Analógico para Digital (ADC). O processo de conversão de um valor analógico em valor digital é conhecido como Conversão Analógica para Digital. Resumindo, os sinais analógicos são sinais do mundo real ao nosso redor, como som e luz.

Os sinais digitais são equivalentes analógicos em formato digital ou numérico que são bem compreendidos por sistemas digitais como microcontroladores. ADC é um hardware que mede sinais analógicos e produz um equivalente digital do mesmo sinal. Os microcontroladores AVR possuem um recurso ADC embutido para converter a tensão analógica em um número inteiro. AVR convertê-lo em um número de 10 bits no intervalo de 0 a 1023.

Usamos o conversor analógico para digital do nível de tensão do circuito divisor com LDR para medir a intensidade da luz.

Inicialize ADC:

TADCSRA | = (1 << ADEN) - Habilitar ADC

ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - configurar prescaler ADC = 128

ADMUX = (1 << REFS0) - configurar referência de tensão = AVCC; - configurar canal de entrada = ADC0

Assista ao vídeo com uma descrição detalhada do microcontrolador ADC AVR: Microcontrolador AVR. Medição da intensidade da luz. ADC e LDR

Etapa 4: Motor DC do Controlador e Módulo Driver do Motor Dual H-Bridge-L298N

Motor DC Controlador e Módulo Driver do Motor Dual H-Bridge-L298N
Motor DC Controlador e Módulo Driver do Motor Dual H-Bridge-L298N
Motor DC Controlador e Módulo Driver do Motor Dual H-Bridge-L298N
Motor DC Controlador e Módulo Driver do Motor Dual H-Bridge-L298N
Motor DC Controlador e Módulo Driver do Motor Dual H-Bridge-L298N
Motor DC Controlador e Módulo Driver do Motor Dual H-Bridge-L298N

Usamos drivers de motor DC porque os microcontroladores não são capazes de fornecer corrente não superior a 100 miliamperes em geral. Os microcontroladores são inteligentes, mas não fortes; este módulo adicionará alguns músculos aos microcontroladores para acionar motores CC de alta potência. Ele pode controlar 2 motores CC simultaneamente até 2 amperes cada ou um motor de passo. Podemos controlar a velocidade usando o PWM e também a direção de rotação dos motores. Além disso, é usado para direcionar o brilho da fita LED.

Descrição do pin:

Porta OUT1 e OUT2, que é para conectar o motor DC. OUT3 e OUT4 para conectar fita LED.

ENA e ENB são pinos de habilitação: conectando ENA em alto (+ 5V), habilita a porta OUT1 e OUT2.

Se você conectar o pino ENA a baixo (GND), ele desabilita OUT1 e OUT2. Da mesma forma, para ENB e OUT3 e OUT4.

IN1 a IN4 são os pinos de entrada que serão conectados ao AVR.

Se IN1-alto (+ 5V), IN2-baixo (GND), o OUT1 fica alto e OUT2 fica baixo, então podemos acionar o motor.

Se IN3-alto (+ 5V), IN4-baixo (GND), o OUT4 fica alto e OUT3 fica baixo, portanto a luz LED de fita acende.

Se você quiser inverter o sentido de rotação do motor, basta inverter a polaridade IN1 e IN2, da mesma forma para IN3 e IN4.

Ao aplicar o sinal PWM a ENA e ENB, você pode controlar a velocidade dos motores em duas portas de saída diferentes.

A placa pode aceitar de 7 V a 12 V nominalmente.

Jumpers: Existem três pinos de jumpers; Jumper 1: se o seu motor precisar de alimentação superior a 12 V, você deve desconectar o Jumper 1 e aplicar a tensão desejada (máx. 35 V) no terminal de 12 V. Traga outra fonte de 5 V e entrada no terminal de 5 V. Sim, você deve inserir 5 V se precisar aplicar mais de 12 V (quando o Jumper 1 for removido).

A entrada de 5 V é para o funcionamento adequado do IC, uma vez que a remoção do jumper irá desabilitar o regulador de 5 V embutido e proteger contra tensão de entrada mais alta do terminal de 12 V.

O terminal de 5 V atua como saída se sua alimentação estiver entre 7 V a 12 V e atua como entrada se você aplicar mais de 12 V e o jumper for removido.

Jumper 2 e Jumper 3: Se você remover esses dois jumpers, terá que inserir o sinal de ativação e desativação do microcontrolador, a maioria dos usuários prefere remover os dois jumpers e aplicar o sinal do microcontrolador.

Se você mantiver os dois jumpers, OUT1 a OUT4 estarão sempre habilitados. Lembre-se do jumper ENA para OUT1 e OUT2. Jumper ENB para OUT3 e OUT4.

Etapa 5: Escrevendo código para um programa em C. Carregando o arquivo HEX na memória Flash do microcontrolador

Escrita e construção da aplicação do microcontrolador AVR em Código C utilizando a Plataforma de Desenvolvimento Integrada - Atmel Studio.

#ifndef F_CPU # define F_CPU 16000000UL // informando a frequência do cristal do controlador (16 MHz AVR ATMega328P) #endif

#include // cabeçalho para habilitar o controle do fluxo de dados sobre os pinos. Define pinos, portas, etc. #include // cabeçalho para habilitar a função de atraso no programa

#define BUTTON1 2 // interruptor de botão conectado à porta B pino 2 #define DEBOUNCE_TIME 25 // tempo para esperar enquanto o botão "de-bouncing" #define LOCK_INPUT_TIME 300 // tempo de espera após um pressionamento de botão

// Timer0, inicialização PWM void timer0_init () {// configurar o temporizador OC0A, pino OC0B no modo de alternância e modo CTC TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // configura o temporizador com prescaler = 256 TCCR0B | = (1 << CS02); // inicializa o contador TCNT0 = 0; // inicializa o valor de comparação OCR0A = 0; }

// Inicialização ADC void ADC_init () {// Habilitar ADC, amostragem freq = osc_freq / 128 definir prescaler para valor máximo, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

ADMUX = (1 << REFS0); // Selecione a referência de tensão (AVCC)

// Status da chave do botão unsigned char button_state () {

/ * o botão é pressionado quando o bit BUTTON1 é limpo * /

if (! (PINB & (1 <

{

_delay_ms (DEBOUNCE_TIME);

if (! (PINB & (1 <

}

return 0;

}

// Inicialização das portas void port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - BOTÃO COMUTADOR DIRETO PORTAB = 0b00010110;

DDRD = 0b01100000; // PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD = 0b00000000;

DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Defina todos os pinos de PORTC para baixo, o que o desliga. }

// Esta função lê o valor do conversor analógico para digital. uint16_t get_LightLevel () {_delay_ms (10); // Aguarde algum tempo até que o canal seja selecionado ADCSRA | = (1 << ADSC); // Inicie a conversão ADC definindo o bit ADSC. Escreva 1 para ADSC

enquanto (ADCSRA & (1 << ADSC)); // Aguarde a conclusão da conversão

// ADSC torna-se 0 novamente até então, execute o loop continuamente _delay_ms (10); retorno (ADC); // Retorna o resultado de 10 bits

}

// Esta função mapeia novamente um número de um intervalo (0-1023) para outro (0-100). mapa uint32_t (uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) {return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }

int main (vazio)

{uint16_t i1 = 0;

port_init ();

timer0_init (); ADC_init (); // inicialização ADC

enquanto (1)

{i1 = mapa (get_LightLevel (), 0, 1023, 0, 100);

OCR0A = i1; // Define o canal de registro de comparação de saída A OCR0B = 100-i1; // Define o registro de comparação de saída do canal B (invertido)

if (button_state ()) // Se o botão for pressionado, alterna o estado do LED e o retardo por 300ms (#define LOCK_INPUT_TIME) {PORTB ^ = (1 << 0); // alternando o estado atual do pino IN1. PORTB ^ = (1 << 1); // alternando o estado atual do pino IN2. Inverta a direção de rotação do motor

PORTB ^ = (1 << 3); // alternando o estado atual do pino IN3. PORTB ^ = (1 << 4); // alternando o estado atual do pino IN4. A fita LED está desligada / ligada. _delay_ms (LOCK_INPUT_TIME); }}; return (0); }

A programação está completa. Em seguida, construindo e compilando o código do projeto em um arquivo hexadecimal.

Carregando o arquivo HEX na memória flash do microcontrolador: digite na janela do prompt do DOS o comando:

avrdude –c [nome do programador] –p m328p –u –U flash: w: [nome do arquivo hexadecimal]

No meu caso é:

avrdude –c ISPProgv1 –p m328p –u –U flash: w: PWM.hex

Este comando grava o arquivo hexadecimal na memória do microcontrolador. Assista ao vídeo com uma descrição detalhada da gravação da memória flash do microcontrolador: Gravação da memória flash do microcontrolador…

OK! Agora, o microcontrolador funciona de acordo com as instruções do nosso programa. Vamos dar uma olhada!

Etapa 6: o circuito elétrico

O Circuito Elétrico
O Circuito Elétrico
O Circuito Elétrico
O Circuito Elétrico

Conecte os componentes de acordo com o diagrama esquemático.

Recomendado: