Aula Prática - PWM (Atualizada em 28_02_2015 ).pdf

Embed Size (px)

Citation preview

  • ltima Atualizao 19/01/2015

    LASEC FEELT

    PWM MUDULAO POR LARGURA DE PULSO & ESC - CONTROLE ELETRNICO DE VELOCIDADE

    UNIVERSIDADE FEDERAL DE UBERLNDIA

    FACULDADE DE ENGENHARIA ELTRICA - FEELT

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina2

    Sumrio BeagleBone Black ....................................................................................................... 3PWM ........................................................................................................................... 3Criar Conexo com a BeagleBone Black .................................................................... 4Exemplo - PWM .......................................................................................................... 5

    Passo 3: Para compilar e executar o programa pwm execute o comando make all: ............................................................................................................................... 10

    Exemplo Acionamento de um ESC por PWM ........................................................ 11

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina3

    BeagleBone Black

    PWM A modulao por largura de pulso (MLP), mais conhecida pela sigla em ingls PWM (Pulse-Width Modulation), uma tcnica de modulao muito utilizada para controlar a potncia fornecida a determinadas cargas, isto , cargas resistivas, dispositivos eltricos, eletrnicos, eletroeletrnicos, dentre outros. Isso possvel porque o valor mdio de tenso e de corrente fornecida a carga controlada por meio de um interruptor, utilizado entre a fonte e a carga, e que opera em alta frequncia de comutao. Ele abre e fecha muitas vezes por segundo de modo que quanto mais ficar fechado, com relao ao tempo em que ficar aberto para um determinado perodo de tempo, maior ser a potncia transferida para a carga. Exemplo1 Variando a intensidade luminosa de um LED por PWM: Neste exemplo, a intensidade luminosa de um LED ser ajustada de acordo com a razo cclica do PWM do pino P9_14 que, por sua vez, ser ajustada por meio da tenso lida na entrada analgica AIN0. Por isso, o mesmo cdigo e configuraes de hardware utilizados no exemplo do ADC sero utilizados para ajustar a razo cclica. Deste modo, a razo cclica ser proporcional ao valor lido na entrada AIN0.

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina4

    USB

    am3359

    5V

    P91 2

    45 46

    P8 1 2

    4645

    eMMC

    HDMI

    560

    P9.14

    P9.1

    GPIO 40

    5kP9.32P9.34

    P9.39AIN0

    Criar Conexo com a BeagleBone Black Criar uma conexo utilizando o PuTTY ou com o comando ssh, como mostrado a seguir: ufu@se:~$ ssh X [email protected] Caso a seguinte mensagem aparea: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent by the remote host is 45:79:10:4a:2c:3c:ff:be:92:d5:18:f7:e2:41:80:8e. Please contact your system administrator. Add correct host key in /home/ufu/.ssh/known_hosts to get rid of this message. Offending RSA key in /home/ufu/.ssh/known_hosts:1 remove with: ssh-keygen -f "/home/ufu/.ssh/known_hosts" -R 192.168.7.2

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina5

    RSA host key for 192.168.7.2 has changed and you have requested strict checking. Host key verification failed.

    Execute o comando proposto: ufu@se:~$ ssh-keygen -f "/home/ufu/.ssh/known_hosts" -R 192.168.7.2 # Host 192.168.7.2 found: line 1 type RSA /home/ufu/.ssh/known_hosts updated. Original contents retained as /home/ufu/.ssh/known_hosts.old ufu@se:~$

    Ento, tente a conexo novamente: ufu@se:~$ ssh X [email protected] The authenticity of host '192.168.7.2 (192.168.7.2)' can't be established. RSA key fingerprint is 45:79:10:4a:2c:3c:ff:be:92:d5:18:f7:e2:41:80:8e. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.7.2' (RSA) to the list of known hosts. [email protected]'s password: root@beaglebone:~# OBS: Responda yes e pressione e pressione novamente quando a password for solicitada

    Exemplo - PWM Criando um diretrio para o projeto: ufu@se:~$ ssh -X [email protected] [email protected]'s password: root@beaglebone:~# mkdir pwm root@beaglebone:~# cd pwm root@beaglebone:~/PWM# gedit pwm.c OBS: Na distribuio do Debian para BeagleBone Black, o editor gedit no vem instalado. Sendo assim, utilize o editor nano ou tea

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina6

    Execute o editor gedit, copie (Ctrl + C) o cdigo do arquivo pwm.c e cole-o no editor. Em seguida, salve-o e saia do editor. Se preferir, copie o cdigo a partir do arquivo pwm.c disponibilizado junto com esta apostila em:

    https://mega.co.nz/#F!VhsRBSAY!ql-q02nfmc9GKtEctZf8Bg

    pwm.c #include #include #define SYSFS_ADC_DIR "/sys/bus/iio/devices/iio:device0" #define SYSFS_PWM_DIR "/sys/devices/ocp.2/pwm_test_" #define MAX_BUF 64 #define P9_14 "P9_14.11" // O valor 11 do 14.11 deve ser configurado de acordo com o valor do arquivo // (pwm_test_P9_14.11) encontrado na pasta "/sys/devices/ocp.2/" int adc_read(int); void configPWM(const char*, unsigned long, unsigned long, int); void setDuty(const char*, unsigned long); int main() { int valorAD; //configPWM(P9_14,1000000000,0, 1); //Frequency = (1x10E9) = 1Hz configPWM(P9_14,409500,0, 0); //Frequency = 1x10E9/409500 = 2442Hz while(1) { valorAD = adc_read(0); printf("Valor do AD : %d\n", valorAD); usleep(100000); setDuty(P9_14, (long)(valorAD*100)); } return 0; } // Funo para a leitura do ADC - canal 0 a 6 int adc_read(int pin) { int fd; int len; char buf[MAX_BUF];

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina7

    char ch[MAX_BUF]; snprintf(buf, sizeof(buf), SYSFS_ADC_DIR "/in_voltage%d_raw", pin); fd = open(buf, O_RDONLY); read(fd, ch, MAX_BUF); fd = open(buf, O_RDONLY); if (fd < 0) { perror("adc/get-value"); } close(fd); return atoi(ch); } // Funo para configurar o PWM void configPWM(const char* pino, unsigned long periodo, unsigned long duty, int polaridade) { int fd, len; char buf[MAX_BUF]; snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/period", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "%lu", periodo); write(fd, buf, len); close(fd); snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/duty", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "%lu", duty); write(fd, buf, len); close(fd); snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/polarity", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "%d", polaridade); write(fd, buf, len); close(fd); snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/run", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "1", polaridade); write(fd, buf, len); close(fd); } // Funo para atualizar o Duty Cycle void setDuty(const char* pino, unsigned long duty)

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina8

    { int fd, len; char buf[MAX_BUF]; snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/duty", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "%lu", duty); write(fd, buf, len); close(fd); }

    Execute o editor gedit, copie (Ctrl + C) o cdigo do arquivo Makefile e cole-o no editor. Em seguida, salve-o e saia do editor. Se preferir, copie o cdigo a partir do arquivo Makefile.txt disponibilizado junto com esta apostila.

    Makefile comp:

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina9

    gcc pwm.c -o pwm clean: rm pwm run: ./pwm all: clean comp run

    Para que o pino P9_39 possa ser utilizado como entrada analgica AIN0 e o pino P9_14 configurado para a funo PWM, necessrio carregar o Device Tree com as devidas configuraes. Para que estas configuraes sejam carregadas durante a inicializao, localize a pasta BEAGLEBONE, edite o arquivo uEnv.txt (para editar d um duplo clique sobre o arquivo) e acrescente os seguintes comandos: optargs=quiet drm.debug=7 capemgr.enable_partno=BB-ADC,am33xx_pwm,bone_pwm_P9_14

    Na sequncia, salve o arquivo e ejete a BeagleBone Black, como mostrado na figura abaixo:

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina10

    OBS: Quando a BeagleBone no ejetada as modificaes salvas podero ser perdidas...

    Em seguida, reinicialize o kit e aguarde que a conexo se reestabelea. Passo 3: Para compilar e executar o programa pwm execute o comando make all:

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina11

    Exemplo Acionamento de um ESC por PWM ESC a abreviao de Electronic Speed Control, um circuito eletrnico com o propsito de variar a velocidade, sentido de rotao e possivelmente realizar a frenagem de um motor eltrico. Os ESCs so frequentemente usados em conjunto com transmissores de rdio controle para acionar motores trifsicos sem escova e so empregados em drones e automodelos.

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina12

    Os ESCs so controlados por um sinal denominado PPM (Pulse Position Modulation). Eles so fabricados para aceitar um sinal com frequncia de 50Hz (20ms) com pulso que varia de 1 a 2ms.

    1700mAhBateria de Alta Descarga LI-PO ESC

    2 ~ 3S

    (com reverso)

    25A+-BEC 2AESC Fornece 5V

    GND

    PPM

    USB

    am3359

    5VP91

    2

    4546

    P8 1246

    45

    eMMC

    HDMI

    P9.16

    P9.1

    GPIO51

    Neutro

    Breque

    Acelerao Mxima

    20ms

    1,5ms

    1ms

    2ms

    A maioria dos ESCs mais modernos possuem um circuito para eliminar a bateria (BEC - battery eliminator circuit) para fornecer energia ao receptor. Neste exemplo, o BEC est fornecendo 5V para a BeagleBone Black.

    Funes Bsicas para o Acionamento do ESC: #include #include #include #include using namespace std; #define SYSFS_PWM_DIR "/sys/devices/ocp.2/pwm_test_" #define SERVO "P9_14.10" #define ESC "P9_16.10" //The value 10 from 14.10 must be set to match the archive // pwm_test_P9_14.10 and it can be found in the directory "/sys/devices/ocp.2/"

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina13

    #define MAX_BUF 64 void configPWM(const char*, unsigned long, unsigned long, int); void setDuty(const char*, unsigned long); void calibraESC(void); int main() { configPWM(ESC, 20000000, 0, 0); //Frequency = 1x10E9/20000000 = 50Hz (1Hz = 1x10E9) //configPWM(SERVO, 20000000, 1500000, 0); // usleep(3000000); // Delay 3s //calibraESC(); // Calibrate ESC on firts power on setDuty(ESC, 1500000); // If ESC has the reverse function, a 1,5ms pulse will set // ESC in the neutral state (no output power) usleep(5000000); setDuty(ESC, 2000000); // Motor runs at full speed usleep(5000000); setDuty(ESC, 1000000); // Breaks the motor usleep(5000000); while(1) { // Infinite loop } } void calibraESC(void) { printf("Iniciando com o valor mximo...\n"); configPWM(ESC, 20000000, 2000000, 0); usleep(5000000); printf("Valor mnimo\n"); setDuty(ESC, 1000000); usleep(4000000); printf("Valor neutro\n"); setDuty(ESC, 1500000); usleep(4000000); printf("Fim da calibrao do ESC\n"); } // Funo para configurar o PWM void configPWM(const char* pino, unsigned long periodo, unsigned long duty, int polaridade) { int fd, len; char buf[MAX_BUF]; // Perodo do PWM (em microsegundos) snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/period", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "%lu", periodo); write(fd, buf, len); close(fd);

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina14

    // Duty Cycle de 0 a "periodo" (0 a 100%) snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/duty", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "%lu", duty); write(fd, buf, len); close(fd); // Polaridade: 0 (nvel lgico alto como parte ativa), 1 (nvel lgico baixo como parte ativa) snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/polarity", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "%d", polaridade); write(fd, buf, len); close(fd); // Habilita o PWM snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/run", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "1"); write(fd, buf, len); close(fd); } // Funo para atualizar o Duty Cycle void setDuty(const char* pino, unsigned long duty) { int fd, len; char buf[MAX_BUF]; // Duty Cycle de 0 a "periodo" (0 a 100%) snprintf(buf, sizeof(buf), SYSFS_PWM_DIR "%s/duty", pino); fd = open(buf, O_WRONLY); len = snprintf(buf, sizeof(buf), "%lu", duty); write(fd, buf, len); close(fd); }

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina15

    Arduno

    16-bit Timer/Counter1 with PWM (Pag. 111) O kit do Arduno UNO possui interfaces PWM disponibilizadas nos pinos PB1 e PB2, como indicado na figura abaixo:

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina16

    Os registradores principais utilizados na configurao e controle destas sadas so: 14.4.3 DDRB The Port B Data Direction Register ( Pag. 91 ) O registrador DDRB no um registrador especfico do PWM, mas necessrio configurar os pinos PB1 e PB2 como sada para posteriormente ativar a funo OC1A e OC1B.

    16.11.1 TCCR1A Timer/Counter1 Control Register A ( Pag. 131 )

    Os bits COM1A1:0 e COM1B1:0 controlam o comportamento dos pinos de comparao de sada (OC1A e OC1B respectivamente). Table 16-1 mostra a funcionalidade dos bits COM1x1:0 quando os bits WGM13:0 bits so configurados no modo Normal ou CTC (non-PWM).

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina17

    Table 16-2 mostra a funcionalidade dos bits COM1x1:0 quando os bits WGM13:0 bits so configurados no modo fast PWM mode.

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina18

    16.11.2 TCCR1B Timer/Counter1 Control Register B ( Pag. 133 )

    16.11.5 OCR1AH and OCR1AL Output Compare Register 1 A ( Pag. 135 )

    Este um registrador de 16-bit que continuamente comparado com o valor do contador (TCNT1). Quando os valores dos dois registradores so iguais, o resultado da comparao pode ser utilizado para gerar uma interrupo ou uma forma de onda nos pinos OC1x.

    main.c #include #include #include #include "uart.h" #include "ad.h" int ad = 0; int temp = 0; char snum[10]; void pwm_init(void) { DDRB |= (1

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina19

    TCCR1A |= (1

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina20

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina21

    Em seguida realize os seguintes passos: 1) Verifique se o kit est conectado ao PC; 2) Acesse o terminal 3) Utilize os comandos a seguir para compilar e realizar o upload do programa:

    ufu@SE:~$ cd Arduino/ ufu@SE:~/Arduino$ cd PWM ufu@SE:~/Arduino/PWM$ ino build ufu@SE:~/Arduino/PWM$ ino upload Em seguida, abra outro terminal e execute o comando arduino, como mostrado a seguir: ufu@SE:~$ arduino

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina22

    Para abrir a janela do Serial Monitor, pressione (Ctrl + Shift + M) ou utilize o menu, como indicado a seguir:

    O resultado esperado : A janela do Serial Monitor ir exibir o valor atual da entrada analgica A0 e a intensidade luminosa do LED ligado nos pinos GND e PB1 dever ser proporcional ao valor lido. Vale lembrar que o LED dever ser ligado por meio de um resistor em srie para limitar a corrente.

  • 1 Edio 11/2014

    DisciplinadeSistemasEmbarcadosFaculdadedeEngenhariaEltricaUFUPgina23

    Universidade Federal de Uberlndia Faculdade de Engenharia Eltrica

    Disciplina de Sistemas Embarcados

    www.fabiovince.com OU

    www.fabiovince.wordpress.com

    Prof. Fbio V. R. da Silva