Implementação de PWM e Controlo de Motor Servo
com PSoC
Objectivo:
Projectar PWM (“Pulse Width Modulation”, isto é, Modulação por Largura do Impulsos) num PSoC e controlar um motor servo, por variação do ciclo de trabalho (“duty cycle).
Material Necessário:
Placa de desenvolvimento EasyPSoC4 da Mikroelektronica, servo motor de rotação contínua (por exemplo, Parallax continuation rotation servo) e LCD 2x16 (este último dispositivo é incluído com a placa EasyPSoC4).
Pré-Requisitos:
É necessário saber programar em linguagem “C” e ter noções básicas sobre PSoCs, nomeadamante sobre o integrado CY8C27643 da Cypress. O software gratuito “PSoC Designer” da Cypress deverá estar instalado no PC, com a opção do software de programação em “C” da Imagecraft, escolhido como padrão (que pode ser utilizado gratuitamente por um período de 45 dias).
Montagem do Circuito:
Na placa EasyPSoC4 (que inclui como padrão o PSoC DIL CY8C27643 da Cypress), montar o display LCD 2x16 e o motor servo de rotação contínua. Assegurar que o display GLCD não esteja montado na placa EasyPSoC4, por este causar conflitos, quando montado em simultâneo com o LCD 2x16.
Implementação de PWM e Controlo de Motor Servo com PSoC Tayeb Habib
Fig 2: Diagrama do circuito com ligações do display LCD 2x16 e do
servo motor de rotação contínua. A porta P0.7 encontra-se nos
terminais no extremo direito da placa EasyPSoC4 indicado pela seta.
Experiência:
Projecto de controlo por variação do ciclo de funcionamento
(“duty cycle”)
Introdução
A Fig. 3 mostra 3 diferentes “duty cycle”, isto é, ciclos de funcionamento. A primeira imagem mostra uma saída PWM com um ciclo de funcionamento de 75%, isto é, o sinal está ON durante 75% do período, e OFF os outros 25%. As segundas e terceiras imagens mostram saídas de PWM de 50% e 25% respectivamente.
Fig. 3. Sinais PWM com diferentes ciclos de funcionamento
Programação
a)
Iniciar novo projecto no PSoC Designer, dando-lhe um nome, como por exemplo “pwm_servo”. O software perguntará se se quer criar um novo directório, e a resposta deverá ser SIM premindo no botão respectivo. Na janela seguinte escolhe-se “C”, premindo-se depois o botão Concluir.b)
No PSoC Designer escolhe-se LCD que se encontra dentro de Misc Digital do módulo User Module Selection, premindo duas vezes sobre o ícone do LCD. A seguir escolhe-se PWM_16 que se encontra dentro de PWMs do módulo User Module Selection, premindo-se duas vezes sobre o ícone PWM_16.c)
Selected User Modules deverá ficar com os ícones, como se pode vêr a seguir:d)
Premir a seguir o botão (Interconnect View) para se poderem configurar as ligações no PSoC.Implementação de PWM e Controlo de Motor Servo com PSoC Tayeb Habib
Cálculos Preliminares:
VC2 = VC1/3 VC1 = SysClk/8 VC2 = SysClk/(8x3) = 24MHz/24 = 1MHz VC3 = 8 x Baudrate = 8 x 9600 = 76,8K VC3 = VC1/n n = 3000/76,8 = 39,0625 Assim : VC3 Divider = 39Fig. 4. Recursos Globais
Para Parâmetros de Módulos de Utilizador fazem-se as seguintes configurações:
Fig. 5 Configurações PWM16_1, LCD_1 e Portas do PSoC
e)
A janela final de ligações no PSoC deverá ficar configurada como se vê na imagem seguinte:Fig. 5 Janela de configuração das ligações
Acontece que a ligação de Row_0_Output não estará implementada e que a janela estará com o seguinte aspecto:
Fig. 6
Janela actual sem a ligaçãoRow_0_Output
Como se deve constatar, faltará implementar a ligação dentro do eclipse a vermelho, como se pode vêr na figura seguinte:
Implementação de PWM e Controlo de Motor Servo com PSoC Tayeb Habib
Fig. 7
Falta implementar a ligação dentro do círculo a vermelhoEsta ligação é feita manualmente, premindo duas vezes sobre a terminação da extremidade do lado direito da linha com a côr vermelha, que se vê na Fig. 8, e com a frase “Row_0_Output_3”:
Fig. 8
Linha de implementação da ligação em faltaPremindo duas vezes sobre o terminal no extremo direito da linha vermelha abre-se a seguinte janela:
Escolhe-se o segundo amplificador. Premindo sobre ele aparecerá a seguinte janela:
Fig. 10
Implementação da ligação em faltaNa janela de escolha da Fig. 10, aceita-se “GlobalOutEven_7 (que é de facto P0.7 da ligação do servo). Fecha-se a seguir a janela premindo sonre Close. O resultado final será o da Fig. 5.
Estamos agora aptos para continuar:
f)
A seguir, premir no botão (Generate Application). O PSoC Designer gerará as aplicações.g)
Agora, premir no botão (Application Editor), e dentro de pasta pwm_servo files e a sub-pasta Source files, abrir o ficheiro main.c e escrever o seguinte código, substituindo o croquit que é gerado automáticamente://--- // Linhas principais em "C"
// Implementação de PWM e Controlo de Motor Servo
// Autor: Tayeb Habib – Aliatron email: tayeb.habib@aliatron.pt // Código adaptado de http://narong.engr.tu.ac.th/microlab/doc // 2 de Agosto de 2009
//--- #include <m8c.h> //Especificação de constantes e macros #include "PSoCAPI.h" //Definições de API PSoC para todos //os Módulos #include <stdlib.h> #include <lcd_1.h> void main() { DWORD i; char TextBuff[10];
Implementação de PWM e Controlo de Motor Servo com PSoC Tayeb Habib LCD_1_Start(); //Inicaliza LCD PWM16_1_Start(); //Inicializa PWM PWM16_1_WritePeriod(2000); LCD_1_Position(0,0); LCD_1_PrCString("Teste Servo"); i=1000;
PWM16_1_WritePulseWidth(i); //Ajusta largura do impulso while(1)
{
if(i>1999) {i=20;}
if(PRT0DR & 0x10) //Testa Porta 0_4 {
i++;
LCD_1_Position(1,0);
LCD_1_PrCString("Duty cicle ");
itoa(TextBuff,(i*100)/2000,10); //Converte integral para string base 10 //de Duty Cycle
LCD_1_PrString(TextBuff); LCD_1_PrCString(" % "); PWM16_1_WritePulseWidth(i); } } }
h)
Premir no botão (Compile/Assemble). O resultado poderá ser visto na janela Build da parte inferior de PSoC Designer, e que será:Compiling...
creating project.mk ./main.c
main.o - 0 error(s) 0 warning(s) 19:11:27
i)
Finalmente premir no botão (Build). O resultado poderá ser visto na janela Build da parte inferior de PSoC Designer, e que será:creating project.mk -- no changes lib/lcd_1.asm lib/psocconfig.asm lib/psocconfigtbl.asm lib/pwm16_1.asm lib/pwm16_1int.asm ./boot.asm ./main.c Linking..
!W warning: area 'pwm_servo_RAM' not defined in startup file './obj/boot.o' and does not have an link time address.
Area 'pwm_servo_RAM' follows area 'data'. Starting address 0xa. ROM 11% full. 1843 bytes used (does not include absolute areas). RAM 3% full. 10 bytes used (does not include stack usage).
Nota: O aviso de alocação de memória RAM é típico para o compilador da Imagecraft. O boot.asm prevê tal aviso que não aparece nos outros compiladores. O compilador de Imagecraft acaba por alocar a memória RAM quando compila.
j)
O ficheiro pwm_servo.hex será gerado, e que ficará dentro da pasta Output do directório criado no início da programação, o qual pode agora ser utilizado para programar o PSoC da placa EasyPSoC4. Quando o PSoC estiver programado com o hex, o display LCD 2x16 mostrará na primeira linha “Teste Servo” e na segunda linha o actual Duty Cycle gerado. O Duty Cycle pode ser alterado premindo primeiro o botão de Reset do EasyPSoC4, e depois premindo o botão de pressão P0.4. Se o servo estiver já accionado, pode ser travado, premindo o botão de pressão P0.7 em simultâneo com o P0.4, permitindo assim que se altere o Duty Cycle.Conclusões:
Os PSoCs oferecem ciclos rápidos de desenvolvimento, traduzindo-se em completos sistemas embebidos, com componentes activos analógicos e digitais incluídos neles, sendo assim necessários poucos componentes externos. Estes dispositivos fabricados pela Cypress, têm-se provado ser extremamente extensíveis, sendo usados, por exemplo, em coisas tão simples como as escovas de dentes da marca “Sonicare” e sapatilhas da marca “Adidas”. Uma característica de solução chamada “CapSense”, da Cypress, controla no écrã do Apple iPod o scroll sensível ao toque.