Eletrônica Silveira
Olá, Seja Bem-Vindo ao Fórum Eletrônica Silveira!!!!
Para você poder ver os mais variados Projetos do nosso Fórum, você precisa fazer o cadastro!

Depois de se Cadastrar, não se esqueça de ler as regras do fórum!

http://eletronicasilveira.forumeiros.com/t3-regras-do-forum#3


Administrador do Fórum,
Rafael Silveira
HOMENAGEM

Na vida tudo passa tudo acontece mas alguém igual a você a gente jamais esquece




★ 22 de novembro de 1991

† 12 de março de 2016

Nosso eterno amigo, administrador e fundador deste fórum
Quem está conectado
25 usuários online :: 2 usuários cadastrados, Nenhum Invisível e 23 Visitantes :: 2 Motores de busca

alanjunior, varkrisz

[ Ver toda a lista ]


O recorde de usuários online foi de 264 em Seg 18 Mar 2013 - 11:54
Eletrônica Perez
CM Eletrônica
Top dos mais postadores
Rafael Silveira (7816)
 
Caca Silva (5945)
 
renatoscp (3825)
 
CMeletronica (3137)
 
michel chagas (2791)
 
Railson (2118)
 
alexsandro rodrigues de a (1776)
 
naldo santos (1599)
 
ablacon64 (1220)
 
gilvantexas (1061)
 

Medidor de Velocidade

Publicidade

Estudos PWM em microcontroladores - Parte II

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Tutorial Estudos PWM em microcontroladores - Parte II

Mensagem por Anderson M em Qua 30 Abr 2014 - 16:55




Estudos PWM em microcontroladores - Parte II:


Configurações dos módulos CCP1 e CCP2.

Antes de tudo, seria necessário uma leitura do artigo do link abaixo, para assim
nós prosseguimos ao exercício parte II. Pois algumas coisas não serão detalhadas
novamente, por acabar deixando o post enorme com informações já descritas no
tópico abaixo.

Estudos PWM em microcontroladores - Parte I

http://eletronicasilveira.forumeiros.com/t5325-estudos-pwm-em-microcontroladores-parte-i

Continuando com os exercícios sobre PWM, agora vamos fazer utilização dos
módulos CCP1 e CCP2 simultaneamente.

Esquemático do exercício II na imagem abaixo:



NOTE: O esquemático seria o mesmo do exercício anterior, apenas foram adicionados um outro trimpot RV2, onde o terminal central está conectado ao pino 3 (RA1/AN1) do MCU.

Na etapa de saída foi adicionado uma réplica com um outro POWER MOSFET (IRF830), D2 (1N5408), R4 (10R), R5 (1K) e também um motor 12 Vcc.

O módulo CCP2 que vamos utilizar, se encontra no pino 16 (RC1/CCP2A) do MCU. O sinal PWM seguirá ao resistor R4 ( 10R ) fazendo o chaveamento do Q2 POWER MOSFET.

NOTE: Os transístores Q1 e Q2 deste exercício são; IRF830, o datasheet segue no link abaixo.

http://www.datasheetcatalog.com/datasheets_pdf/I/R/F/8/IRF830.shtml

Detalhe importante: Para criação de um layout oficial do projeto, recomendo
o uso obrigatório de ( 02 ) CI's para efetuar proteção do MCU, estes CI's são um (Amplificador Operacional) e um (Driver de Mosfet).

O uso destes CI's em particular, seria para proteção do MCU, e ainda por cima teremos várias opções de MOSFETs para utilização, pois o valor de corrente fornecida nos pinos 16 e 17 do MCU é de apenas ( 0.025A ), uma corrente limitada para excitação de outros tipos de MOSFETs.

Portanto: É obrigatório o uso destes CI's citados acima entre o MCU e transístores chaveadores Q1 e Q2 no projeto final, pois neste esquemático ( Beta ), eles não foram colocados, vou deixar isso para vocês fazer em suas modificações, e assim usando os seus talentos macrabos.

Este circuito do esquématico foi testado e aprovado na prática, utilizado para
controlar ( 02 ) motores de cooler 12 Vcc retirados de umas fontes ATX.

No exercício parte IV que pretendo postar no fórum, ficará ainda mais interessante, vamos utilizar teclas táctil ao invés de (Trimpots) para efetuar o controle de rotação, ainda este mesmo circuito fará mudança do sentido de rotação, ou seja, vai girar no sentido anti-horário também. Vamos utilizar um CI específico que seria um (Driver de Motor) para executar estas tarefas juntamente com o algorítimo proposto.

Voltando....

Neste circuito (Pwm Control II) temos como objetivo observar o funcionamento dos módulos CCP1 e CCP2 habilitados com uma frequência fixa de 30 Khz, esta frequência poderá ser modificada via programação conforme às suas necessidades em seus projetos.

Vamos apenas variar o (Duty Cycle), ou (ciclo de trabalho) onde podemos controlar o RPM do motor DC.  

Como já foi falado no execício anterior, vamos apenas fazer modificação da variação
do (Duty Cycle), ou seja, o ciclo de trabalho através dos trimpots RV1 e RV2 conectados ao pino 2 (RA0/AN0) e pino 3 (RA1/AN1). Conforme o valor for lido no (ADC) haverá mudança do (Duty Cycle) no sinal PWM, mas mantendo o valor de frequência constante.

O pino 2 (RA0/AN0) e pino 3 (RA1/AN1) do MCU irá recolher o valor analógico entre 0V e 5V através dos RV1 e RV2, logo após de recolhida esta amostra de tensão no formato analógico, vai ocorrer o processo de conversão em valores no formato digital.

No algorítimo será implementado para efetuar o controle com precisão, isto é, usará
um fator de conversão na escala entre 0 e 255 para variar o (Duty Cycle) ciclo de trabalho entre 0% e 100%.

NOTE: Os controles dos trimpots RV1 e RV2 serão individuais, assim fazendo o controle (Duty Cycle) dos módulos CCP1 e CCP2 também serem individuais, ajustando o (Duty Cycle) do sinal PWM de maneira individual nos respectívos pinos 16 e 17 do MCU.

___________________________________________________________________

Código fonte do exercício nº 2:

O algorítimo está com comentários para uma melhor compreensão.  

Selecione, copie e cole o código fonte do exercício nº 2 que está na caixa abaixo:

Código:
/*
 * Projeto: PWM CONTROL II
 * MikroC v6.0.0
 * Copyright (c) Anderson M, 30/04/2014.
 * Fórum: Eletrônica Silveira
 * MCU: PIC 18F452
 * Cristal Oscilador Externo: 10.0 Mhz
 * Oscilador XT, MCRL (Habilitado), PWRT ON (Habilitado), WDT OFF (Desabilitado)
 * Bibliotecas adicionadas: (ADC) & (PWM)
*/
// *****************************************************************************

int x = 0;   // Declaração de variável global
int y = 0; // Declaração de variável global

void main(){

   ADCON1 = 0b00001001;  // Configura e define os pinos PORT A como (A/D)
   TRISA = 255;         // Define os pinos PORTa como entrada

// ******* Ajuste de frequência e inicialização dos módulos CCP1 - CCP2 ********
   Pwm1_Init(30000);      // Inicializa o módulo PWM (1) com frequência 30 KHz
   Pwm2_Init(30000);     // Inicializa o módulo PWM (2) com frequência 30 KHz
// *****************************************************************************

// ************ Inicialização do sinal PWM nos módulos CCP1 - CCP2 *************
   Pwm1_Start();         // Inícializa a geração do sinal PWM no módulo CCP1
   Pwm2_Start();       // Inícializa a geração do sinal PWM no módulo CCP2
// *****************************************************************************

while(1){ //LOOP infinito...
// *************** Leitura e ajuste (DUTY CYCLE) do módulo CCP1 ****************
  y = Adc_Read(0);    // Lê o valor do canal (AD0) e salva na variável (y)
  y = (y * 0.24);    // Converte o valor em (DUTY CYCLE)
  Pwm1_Set_Duty(y); // Envia o valor lido da variável (y) para o módulo CCP1 PWM - Pino 17 RC2
  Delay_us(10);    // Aguarda 10 microsegundos para executar instruções do (CCP2)
// *****************************************************************************

// *************** Leitura e ajuste (DUTY CYCLE) do módulo CCP2 ****************
  x = Adc_Read(1);    // Lê o valor do canal (AD1) e salva na variável (X)
  x = (x * 0.24);    // Converte o valor em (DUTY CYCLE)
  Pwm2_Set_Duty(x); // Envia o valor lido da variável (X) para o módulo CCP2 PWM - Pino 16 RC1
  Delay_us(10);    // Aguarda 10 microsegundos para retornar leituras do (AD0) e (AD1)
// *****************************************************************************
  }
// *****************************************************************************

}

Detalhe: Não vou explicar como gerar o arquivo HEX no compilador, pois isso já foi um assunto bem detalhado no exercício nº 1.

Siga os mesmo procedimentos do tópico abaixo:

http://eletronicasilveira.forumeiros.com/t5325-estudos-pwm-em-microcontroladores-parte-i

___________________________________________________________________


Detalhes adicionais do algorítimo implementado no projeto:

Aqui será comentado os detalhes do algorítimo do exercício nº 2 que servirá também para o exercício  nº 1.

/*
* Projeto: PWM CONTROL II
* MikroC v6.0.0
* Copyright (c) Anderson M, 30/04/2014.
* Fórum: Eletrônica Silveira
* MCU: PIC 18F452
* Cristal Oscilador Externo: 10.0 Mhz
* Oscilador XT, MCRL (Habilitado), PWRT ON (Habilitado), WDT OFF (Desabilitado)
* Bibliotecas adicionadas: (ADC) & (PWM)
*/


Acima temos o nosso cabeçalho do algorítimo, todo bom algorítimo deve possuir um
cabeçalho contendo informações para facilitar à vida de outros programadores.

Nele há informações detalhadas do projeto, isso facilita à vida dos programadores que desejam compreender qual é o projeto proposto, compilador utilizado, MCU, cristal de clock, modo de operação do oscilador, bibliotecas utilizadas etc...

NOTE: Os cometários em múltiplas linhas na linguagem C.

Para comentar mais de uma linha usa-se o simbolo /* (barra e asterisco) antes do comentário e */ (asterisco e barra) para indicar o final do comentário com múltiplas linhas.

EX:

/*

* Copyright (c) Anderson M, 30/04/2014.
* Fórum: Eletrônica Silveira

*/

Vocês também encontrará comentários de única linha no algorítimo, detalhando
cada instrução.

Para comentar em uma única linha devemos utilizar // (barra dupla)

EX:

// Configura e define os pinos PORT A como (A/D)
// Define os pinos PORTa como entrada

Tudo que for comentários, o compilador irá ignorar na hora da compilação do algorítimo.

___________________________________________________________________

int x = 0;   // Declaração de variável global
int y = 0; // Declaração de variável global

Acima temos declarações de variáveis global. Variáveis são um espaço reservado
na memória RAM para armazenar informações temporária. Uma variável limita-se
por armazenar um valor por vez.  

A primeira variável mostrada na linha abaixo é do tipo ( int ) inteiro com nome ( X ) e foi atribuído o valor ( 0 ).

int x = 0;

A segunda variável mostrada na linha abaixo é do tipo ( int ) inteiro com nome ( Y ) e foi atribuído também o valor ( 0 ).

int y = 0;

- Ambas estão declaradas como variáveis global, pois são chamadas antes da
função void main()

- Variáveis declaradas antes da função void main() são chamada de variáveis global.

___________________________________________________________________

Função void main() seria à nossa função principal do programa.  

void main() { // Função principal

ADCON1 = 0b00001001;  // Configura e define os pinos PORT A como (A/D)

- ADCON1 -> O registrador ADCON1 é responsável da configuração dos pinos PORT (A).

-  = 0b00001001 -> Valor no formato binário atribuído, é responsável de configurar os pinos do PORT (A) como analógico / Digital (A/D)      

___________________________________________________________________

TRISA = 255;              // Define os pinos PORTa como entrada

- O registrador TRIS é responsável pelo direcionamento dos PORTs do MCU.

- Eles podem ser configurados como sendo entrada ou saída, dependendo do valor atribuído.

- TRISA  -> Configuração do TRIS, sendo escolhido o PORT (A) por adição da letra (A) após o TRIS.

- = 255  -> Valor atribuído para habilitar todos os pinos do PORT (A) como entrada.

___________________________________________________________________

Pwm1_Init(30000);      // Inicializa o módulo PWM (1) com frequência 30 KHz

- Esta rotina faz inicialização do módulo CCP1 com uma frequência fixa determinada pelo programador.

- Pwm1_Init -> Inicializa o pino 17 (RC2/CCP1).

- O valor de frequência é adicionada em Hz entre parênteses (), o valor deve ser uma constante numérica.

Pwm2_Init(30000);     // Inicializa o módulo PWM (2) com frequência 30 KHz

- Esta rotina faz iniciliazação do módulo CCP2 com uma frequência fixa determinada pelo programador.

- Pwm2_Init -> Inicializa o pino 16 (RC1/CCP2A).

- O valor de frequência é adicionada em Hz entre parênteses (), o valor deve ser uma constante numérica.


Detalhe importante: O valor de frequência atribuída deverá ser o mesmo para
ambas rotinas, pois ser for diferente não vai funcionar, pois os módulos CCP1
e CCP2A compartilham do mesmo registrador TMR2 do TIMER2.

___________________________________________________________________

Pwm1_Start();         // Inícializa a geração do sinal PWM no módulo CCP1
Pwm2_Start();       // Inícializa a geração do sinal PWM no módulo CCP2

___________________________________________________________________

while(1){  // Todas as instruções que estiver dentro do while(1) serão executados de forma infinita...

y = Adc_Read(0);    // Lê o valor do canal (AD0) e salva na variável (Y)

- Função que faz leitura do canal ADC ( AD0 ) e salva o valor no espaço reservado da memória RAM.

y = (y * 0.24);        // Converte o valor em (DUTY CYCLE)

- Aqui que acontece aritmética para conversão, pegando o valor temporário lido
da variável (Y) na memória RAM.

- Multiplicado pelo fator de conversão 0.24, que logo será convertido em outro
valor (Y) na escala entre 0 e 255.

Pwm1_Set_Duty(y); // Envia o valor lido da variável (Y) para o
                                 
                                  // módulo CCP1 PWM - Pino 17 (RC2/CCP1).

- Esta rotina envia o novo valor da variável (Y) na escala entre 0 e 255 para configurar o (Duty Cycle) do módulo CCP1.

- Este valor resultante da variável irá depender do ajuste do trimpot RV1.  

Delay_us(10);  // Aguarda 10 microsegundos para executar instruções do (CCP2)

___________________________________________________________________

x = Adc_Read(1);  // Lê o valor do canal (AD1) e salva na variável (X)

- Função que faz leitura do canal ADC ( AD1 ) e salva o valor no espaço reservado da memória RAM.

x = (x * 0.24);       // Converte o valor em (DUTY CYCLE)

- Aqui que acontece aritmética para conversão, pegando o valor temporário lido da variável (X) na memória RAM.

- Multiplicado pelo fator de conversão 0.24, que logo será convertido em outro
valor (X) na escala entre 0 e 255.

Pwm2_Set_Duty(x);  // Envia o valor lido da variável (X) para o

                                   // módulo CCP2 PWM - Pino 16 (RC1/CCP2A).

- Esta rotina envia o novo valor da variável (X) na escala entre 0 e 255 para configurar o (Duty Cycle) do módulo CCP2.

- Este valor resultante da variável (X) irá depender do ajuste do trimpot RV2.  

Delay_us(10);  // Aguarda 10 microsegundos para novas leituras do (ADC).

- 10 microsegundos para retornar ao início da função while(1)
-  Inicializando um novo ciclo.

    }

}

___________________________________________________________________


Finalizando:

No próximo exercício - Configurações dos módulos CCP1 e CCP2 com Duty Cycle estático determinado pelo usuário.

Neste exercício vamos configurar o Duty Cycle de maneira estática desejada e
definida na programação, isso é, o valor do Duty Cycle poderá ser fixado diretamenente no programa nos valores entre 0% e 100%.


Até o exercício nº 3...

Boa sorte a todos  Positivo  

Sds Anderson M
avatar
Anderson M
Avançado
Avançado

Mensagens : 401
Data de inscrição : 07/07/2011
Localização : São Paulo/SP

Voltar ao Topo Ir em baixo

Tutorial Re: Estudos PWM em microcontroladores - Parte II

Mensagem por Anderson M em Qua 30 Abr 2014 - 17:14

Mesmo assim o tópico acabou ficando enorme, mas pelo menos está bem detalhado, eu acho kkkaakkk. Caso alguém tiver alguma dúvida, pode perguntar no tópico.
avatar
Anderson M
Avançado
Avançado

Mensagens : 401
Data de inscrição : 07/07/2011
Localização : São Paulo/SP

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum