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

Título: Será que isto dá para fazer???
Enviado 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:

Código: [Seleccione]
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
Título: Re: Será que isto dá para fazer???
Enviado por: Njay em 24 de Abril de 2013, 19:35
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?
Título: Re: Será que isto dá para fazer???
Enviado por: Tiobel em 24 de Abril de 2013, 20:05
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.
Título: Re: Será que isto dá para fazer???
Enviado por: senso em 24 de Abril de 2013, 21:07
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..
Título: Re: Será que isto dá para fazer???
Enviado por: Njay em 24 de Abril de 2013, 21:25
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().
Título: Re: Será que isto dá para fazer???
Enviado por: Tiobel em 24 de Abril de 2013, 21:54
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
Título: Re: Será que isto dá para fazer???
Enviado por: senso em 24 de Abril de 2013, 23:26
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.
Título: Re: Será que isto dá para fazer???
Enviado por: Njay em 25 de Abril de 2013, 01:42
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)