Sie sind auf Seite 1von 23

UNIVERSIDADE FEDERAL DE

UBERLNDIA
FACULDADE DE ENGENHARIA
ELTRICA - FEELT

LASEC
FEELT

PWM MUDULAO POR LARGURA DE PULSO &


ESC - CONTROLE ELETRNICO DE VELOCIDADE

ltima Atualizao 19/01/2015

1 Edio 11/2014

Sumrio
BeagleBone Black ....................................................................................................... 3
PWM ........................................................................................................................... 3
Criar Conexo com a BeagleBone Black .................................................................... 4
Exemplo - 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

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 2

1 Edio 11/2014

BeagleBone Black
PWM
A modulao por largura de pulso (MLP), mais conhecida pela sigla em ingls PWM (PulseWidth 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.

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 3

1 Edio 11/2014

5V
P9 .1

P9

P8

560

eMMC
P9 .1 4
GPIO 4 0

am3359
5k

P9 .3 2
P9 .3 4

HDMI
A IN 0
P9 .3 9

45 46

USB

4546

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 root@192.168.7.2

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
Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 4

1 Edio 11/2014

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 root@192.168.7.2
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.
root@192.168.7.2's password:
root@beaglebone:~#
OBS: Responda yes e pressione <Enter> e pressione <Enter> novamente quando a
password for solicitada

Exemplo - PWM
Criando um diretrio para o projeto:
ufu@se:~$ ssh -X root@192.168.7.2
root@192.168.7.2'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
Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 5

1 Edio 11/2014

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 <stdio.h>
#include <fcntl.h>
#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];
Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 6

1 Edio 11/2014

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)
Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 7

1 Edio 11/2014

{
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:
Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 8

1 Edio 11/2014

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
ADC,am33xx_pwm,bone_pwm_P9_14

capemgr.enable_partno=BB-

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

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 9

1 Edio 11/2014

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:

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 10

1 Edio 11/2014

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.

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 11

1 Edio 11/2014

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.
1700mAh

Bateria de Alta Descarga LI-PO

PPM
ESC Fornece 5V
GND

ESC 25A
2 ~ 3S
BEC 2A
(com reverso)

P9.1 1

P9.16
GPIO51

45 46

5V

P9

USB
am3359
P8

eMMC

HDMI

1
2

45 46

20ms

Neutro

Breque

Acelerao
Mxima

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 <iostream>
#include <fcntl.h>
#include <stdlib.h>
#include <termios.h>
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/"

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 12

1 Edio 11/2014

#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);

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 13

1 Edio 11/2014

// 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);
}

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 14

1 Edio 11/2014

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:

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 15

1 Edio 11/2014

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).

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 16

1 Edio 11/2014

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

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 17

1 Edio 11/2014

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 <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include "uart.h"
#include "ad.h"
int ad = 0;
int temp = 0;
char snum[10];
void pwm_init(void) {
DDRB |= (1 << DDB1); // PB1 is now output - OC1A

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 18

1 Edio 11/2014

TCCR1A |= (1 << COM1A1); // overrides the normal port functionality of the I/O pin to OC1A - Output Compare Pin
// Pino PB1 do uC e Pino 9 do Kit Arduno (Pag. 131).
TCCR1A |= (1 << WGM12) | (1 << WGM11) | (1 << WGM10); // Timer/Counter Mode of Operation = Fast PWM-10bit, TOP = 0x03FF,
// Update of OCR1x at = BOTTOM, TOV1 Flag Set on = TOP (Pag. 132)
TCCR1B |= (1 << CS11); // set prescaler to 8 and starts PWM
}
int main(void) {
int i = 0; // Loop variable
uart_init();
stdout = &uart_output;
stdin = &uart_input;
ad_init();
pwm_init();
while(1) {
ad = ADCL; // ADCL must be read first, then ADCH
ad = (ADCH << 8) + ad;
OCR1A = ad; // set PWM duty cycle
printf("O valor do A/D %c: %d\r\n", 233, ad);
_delay_ms(100);
}
return 0;
}

Os arquivos dos programas esto disponibilizados em:


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

Faa o download dos arquivos PWM.zip e 2PWM.zip e e na sequncia, utilize


para copiar
e descompactar os arquivos PWM.zip e 2PWM.zip dentro da pasta /home/ufu/Arduino,
conforme indicado abaixo:

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 19

1 Edio 11/2014

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 20

1 Edio 11/2014

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

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 21

1 Edio 11/2014

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.

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 22

1 Edio 11/2014

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

Disciplina de Sistemas Embarcados Faculdade de Engenharia Eltrica UFU Pgina 23

Das könnte Ihnen auch gefallen