HOMENAGEM
† 12 de março de 2016
Quem está conectado?
Há 172 usuários online :: 1 registrado, 0 invisíveis e 171 visitantes :: 2 motores de buscaCaca Silva
O recorde de usuários online foi de 362 em Sex 9 Abr 2021 - 22:11
Últimos assuntos
Top dos mais postadores
Rafael Silveira (7816) | ||||
Caca Silva (6057) | ||||
renatoscp (3891) | ||||
CMeletronica (3234) | ||||
michel chagas (2791) | ||||
Railson (2119) | ||||
alexsandro rodrigues de a (1835) | ||||
naldo santos (1625) | ||||
ablacon64 (1222) | ||||
gilvantexas (1061) |
Tópicos semelhantes
Medidor de Velocidade
Estudos PWM em microcontroladores - Parte II
Página 1 de 1
Estudos PWM em microcontroladores - Parte II
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
https://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:
https://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
Sds Anderson M
Anderson M- Avançado
- Mensagens : 401
Data de inscrição : 07/07/2011
Localização : São Paulo/SP
Re: Estudos PWM em microcontroladores - Parte II
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.
Anderson M- Avançado
- Mensagens : 401
Data de inscrição : 07/07/2011
Localização : São Paulo/SP
Tópicos semelhantes
» Estudos PWM em microcontroladores - Parte I
» Estudos PWM em microcontroladores - Parte IV
» NS450 - FONTE CHAVEADA PARTE 2
» Estudos PWM em microcontroladores - Parte IV
» NS450 - FONTE CHAVEADA PARTE 2
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|
Ontem à(s) 20:57 por sandy silva de oliveira
» >>>>>>> Sobre a criação de novos tópicos<<<<<<<<<<<<<<<
Dom 24 Mar 2024 - 16:10 por crisnich
» Defeito intermitente amplificador Ciclotron TIP5000
Qua 20 Mar 2024 - 9:13 por fastaveira
» Esquema Amplificador Audio Leader AL 5.0
Qua 20 Mar 2024 - 9:01 por fastaveira
» MK4000 - FONTE CHAVEADA FULL BRIDGE
Dom 17 Mar 2024 - 18:43 por sandy silva de oliveira
» amplificador class h tailandes
Sex 15 Mar 2024 - 22:41 por mehuysal
» Amplificador Super Strong
Qui 14 Mar 2024 - 13:03 por Reginaldo Silva
» Amplificador Classe D UCD1500
Qua 13 Mar 2024 - 13:07 por Guille
» NS450 - FONTE CHAVEADA PARTE 2
Seg 11 Mar 2024 - 6:55 por ffernand3s
» DETECTOR DE METAIS IDX-PRO
Sex 1 Mar 2024 - 16:41 por Benyamin
» Amplificador Fonte Simples em teia de aranha
Sex 1 Mar 2024 - 12:17 por Reginaldo Silva
» Manutenção Gradiente 366 / 266
Qui 29 Fev 2024 - 21:40 por tiaogaviao
» Criação pcb esquema phono cápsula ceramica
Qui 29 Fev 2024 - 16:58 por warley cesar
» DETECTOR DE METAIS MKII (PINPOINTER)
Qua 28 Fev 2024 - 19:09 por Benyamin
» Fonte chaveada compacta IR2153D - 10 x 10 cm
Ter 27 Fev 2024 - 22:02 por microbit