Beruflich Dokumente
Kultur Dokumente
UBERLNDIA
FACULDADE DE ENGENHARIA
ELTRICA - FEELT
LASEC
FEELT
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
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.
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
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:~$
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
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:
1 Edio 11/2014
1 Edio 11/2014
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
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.
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);
1 Edio 11/2014
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:
1 Edio 11/2014
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
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
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
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;
}
1 Edio 11/2014
1 Edio 11/2014
ufu@SE:~$ cd Arduino/
ufu@SE:~/Arduino$ cd PWM
ufu@SE:~/Arduino/PWM$ ino build
ufu@SE:~/Arduino/PWM$ ino upload
ufu@SE:~$ arduino
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.
1 Edio 11/2014