LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: Tiobel em 24 de Abril de 2013, 19:03
-
Tenho um duvida que gostava de tirar aqui com o pessoal do avr, que é o seguinte, se eu tiver o seguinte código:
void loop(){
analogWrite(pwm_pin, 128);
switch(var){
case 1: {
faz qualquer coisa....
}
case 2:{
faz outra coisa...
}
.
.
.
}
Quero que a variável do switch case mude sempre que o PWM esteja HIGH, ou seja quero correr o switch a mesma velocidade do PWM.
Isto é possível? Já pesquisei muita coisa mas não encontrei nada semelhante ao que necessito...
Desde já agradeço a ajuda.
Cumprimentos,
Hugo Gomes
-
O que queres fazer é muito "irregular", o que em geral quer dizer que há formas mais simples... antes de ir para isso, o que é que queres fazer realmente?
-
Quero controlar a velocidade de um motor de 3 fases através de um IC com 6 IGBT's.
Ou seja necessito de fazer as combinações da bobines mas pretendo varia a velocidade. A minha ideia era correr apenas um PWM e assim que o valor fosse zero o ciclo parava e quando fosse HIGH passava para a próximo conjunto de bobines.
-
Usa um IC dedicado a isso, como por exemplo o AT90PWM316, e a Atmel tambem tem app-notes para isso.
Mas se realmente queres fazer isso, usa interrupções..
-
Para o PWM usas 3 canais de PWM (o arduino tem). Para a comutação armas uns timers, por exemplo com interrupções, mas se a precisão na velocidade não for critica podes usar programação preemptiva e fazer tudo no ciclo principal da loop().
-
Obrigado pelas respostas :)
OK, vou ver se consigo fazer com as interrupções.
NJay,
Como é que eu implemento programação preemptiva no loop???
Desculpa lá mas ainda sou muito novo nisto :)
Cumprimentos,
Hugo Gomes
-
Para o PWM usas 3 canais de PWM (o arduino tem). Para a comutação armas uns timers, por exemplo com interrupções, mas se a precisão na velocidade não for critica podes usar programação preemptiva e fazer tudo no ciclo principal da loop().
E como é que sincronizas os timers, por acaso, tinha ideia que não dava para fazer, e depois ainda precisas de andar a gerar o dead time á unha.
-
Não precisas de sincronizar os timers, só tens que activar cada um dos canais para fazer PWM numa das fases de cada vez, se é que tou a ver bem como é que se controla um motor desses. Se quiseres fazer rectificação sincrona os AVR em geral têm canais simétricos de PWM (o directo e o "negado") e implementam um dead time fixo (em alguns chips o dead time é configurável mas penso que não é o caso do ATmega328P).
A cena do preemptiva tens aqui estes artigos, o 2º só tenho em Inglês:
http://troniquices.wordpress.com/2010/05/24/arduino-a-fazer-varias-coisas-ao-mesmo-tempo/ (http://troniquices.wordpress.com/2010/05/24/arduino-a-fazer-varias-coisas-ao-mesmo-tempo/)
http://embeddeddreams.com/site/2011/07/23/more-on-doing-several-things-at-the-same-time (http://embeddeddreams.com/site/2011/07/23/more-on-doing-several-things-at-the-same-time)