PWM

Software e Hardware para uC PSoC

Moderadores: andre_luis, 51

PWM

Mensagempor silvinha_88 » 29 Jan 2009 19:50

Oi pessoal,

Estou tentando fazer um projeto com o PSoC só que nao encontrei uma maneira ainda!
Preciso implementar um modulador PWM, que modulasse um sinal de audio, ou seja, um sinal de saída de um mic!
Eu nao consegui fazer isso, nem com o modulo PWM, nem com o conversor ACDINC, que tem uma saida PWM.
No conversor a saida PWM é independente da entrada, apenas configura-se uma largura de pulso, assim como no modulo PWM simples.
Ainda sei usar muito pouco dos recursos do PSoC, entao se voces puderem me ajudar!
:D
silvinha_88
Bit
 
Mensagens: 13
Registrado em: 02 Abr 2008 21:40

Mensagempor proex » 29 Jan 2009 21:18

Na verdade será o sinal de áudio que irá modular o PWM.

Creio que vc deseja modular o PWM com o sinal de áudio fornecido por um Mic conectado na entrada A/D do PSoC , certo?

Primeira coisa vc deve criar uma interrupção para ler o A/D do Mic.

Para fazer amostragens de voz, 8Khz de taxa de amostragem é o suficiente.

8Khz = 125uS.

Então, ajuste a interrupção para cada 125uS.

Depois disso, programe o PWM para uma frequencia de 80Kz.
Com esse valor, o sinal de audio será bem cristalino , quase nao precisando de filtro na saida do PWM.

Feito essas inicializaçoes, quando uma inreruupçao ocorrer, vc deverá ler o A/D. Assim que tiver o valor lido, jogue-o no registrador que controla a largura de pulso do PWM.

Em sintese é assim que se faz.

Como vc vai fazer isso no Psoc, nao faço a minima idéia. Eu conheço o processo mas nao conheço nada do Psoc.

.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Re: PWM

Mensagempor andre_luis » 30 Jan 2009 08:09

silvinha,

Olha, eu posso te assegurar que o que voce quer é possível sim. Talvez não neces´sariamente por PWM.
Eu já fiz um simulador de ECG que recebia serialmente pelo PSoC, dados pela UART e jogava direto no conversor A/D.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor silvinha_88 » 03 Fev 2009 15:04

Tambem entendo muito pouco do PSoC!
Não sei como criar uma interrupçao a cada 125us, nem programar o PWM para uma frequencia de 80khz.

Criei essa rotina!
Ela mostra o valor do dado convertido no Lcd e modifica a largura do pulso do pwm para esse valor!
Teoricamente é isso que ela faz! rs

cpp code
void main()
{

LCD_Start();
ADCINC_Start(ADCINC_HIGHPOWER);
ADCINC_GetSamples(0);
M8C_EnableGInt;

for( ;; )
{

while(ADCINC_fIsDataAvailable() == 0);

LCD_Position(0,1);
LCD_PrHexInt(ADCINC_iGetData());
ADCINC_WritePulseWidth(ADCINC_bGetData());

}
}


Ainda sim nao funcionou! Testei apenas com uma tensao continua 5V, porque nao tive acesso a um laboratorio.
O dado enviado para o LCD é coerente, quando se coloca 5V e 0V,mostrando os respectivos valores convertidos!

O pino pra onde foi roteada a saida PWM, eu liguei em um LED, para testar seu duty cicle! Mais o brilho do LED nao varia, independente da tensão de entrada do conversor!

Se alguem puder me ajudar com a interrupçao, e com as outras configuraçoes! Tem muitas coisas que eu ainda nao consigo fazer direito!


VLW
silvinha_88
Bit
 
Mensagens: 13
Registrado em: 02 Abr 2008 21:40

Mensagempor Sergio38br » 03 Fev 2009 16:13

boa tarde, na tua rotina while não falta as chaves??? { }???
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor paulraf2 » 08 Fev 2009 22:44

Sergio38br
Quando você tem uma instrução for ou um while e você coloca apenas uma instrução depois desses comandos sem as chaves, então apenas essa instrução será feita enquanto as condições do for ou while forem verdadeiras.

Exemplos:
cpp code
int a;
while(1) //Sempre será verdadeiro nesse caso
a += 2; //Instrução contida no while
a++; //Instrução fora do while

----------------------------------------------------------
int a;
while(1) //Sempre será verdadeiro nesse caso
{
a += 2; //Instrução contida dentro do while
a++; //Agora esta instrução está no while.
}

----------------------------------------------------------
int a = 2;
int b = 3;
while( a < b ); //Equivalente: for( ; a < b; );
//Enquanto a for menor que b, o programa ficará parado
//aqui (serve para propósitos onde algo externo ao
//programa muda alguma variável, por exemplo, o
//programa ficará testando um pino que, de início em 1,
//quando for a 0 irá para a próxima instrução,
//Ex: while( Pin == 1 ); )

Espero que tu tenha entendido,
Flw
paulraf2
Bit
 
Mensagens: 17
Registrado em: 08 Jan 2009 18:25

Mensagempor Sergio38br » 09 Fev 2009 09:30

paulraf2

bom dia, sem problema, eu entendo como funciona o while, apenas mencionei que no código
Código: Selecionar todos
for( ;; )
{

while(ADCINC_fIsDataAvailable() == 0); //<===

LCD_Position(0,1);                               
LCD_PrHexInt(ADCINC_iGetData());
ADCINC_WritePulseWidth(ADCINC_bGetData());

}


não sei onde estara corretamente as chaves....
[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor andre_luis » 09 Fev 2009 14:16

Só pra lembrar...

Pra se trabalhar com interrupção no PSoC, deve-se editar um arquivo de configurações ( não lembro o nome ) afim de habilitar o vetor daquela interrupção.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor silvinha_88 » 11 Fev 2009 11:36

Oi!
Desculpa a demora para responder!
Mais o while é sem chaves mesmo!

Ele apenas cria um loop, para prender o programa enquanto o dado amostrado nao fica "pronto".
Poderia ter criado de outro jeito, foi só uma maneira que encontrei!
silvinha_88
Bit
 
Mensagens: 13
Registrado em: 02 Abr 2008 21:40

Mensagempor silvinha_88 » 05 Mar 2009 13:31

Oi gente!!

Teoricamente eu consegui implementar o modulador!

Quando fui testar no laboratorio, para uma tensão senoidal, com frequencia maior que 800Hz, a unica coisa que eu consegui ver no osciloscópio foi muito ruido!

Testei com corrente continua também e o pulso saiu com muto pouco ruido! E o sinal tinha um duty cicle proporcional a tensão de entrada!

E para sinais com frequencias proximas de 300Hz também saiu um sinal, mas ele nao parecia ter sido modulado por uma senoide, porque as larguras do pulso nao estavam diferentes!

Nao sei onde posso ter errado!
Talvez na hora de configurar a interrupçao.

E como faço para tirar o ruido? Se colocar um capacitor na saída ajuda??

VLw
Abraços
silvinha_88
Bit
 
Mensagens: 13
Registrado em: 02 Abr 2008 21:40

Mensagempor Ricardo_Franco » 18 Abr 2009 22:50

Ola Senhores.
Silvinha, não sei exatamente como você configurou os blocos, mas os AD’s do PSoC não costumam ser muito rápidos para realizar as conversões.
Se você puder fornecer mais detlahes do projeto talvez poderemos ajudar mais.
Se você puder usar um AD mais baixo, opte pelo SAR6, o mesmo possui apenas 6 bits, mas é bem rápido.
Ricardo Franco
____________________________________________________________________________________________
web: www.engricardofranco.kit.net
Skype: engricardofranco
Fone Skype: (19) 3119-8162
Ricardo_Franco
Byte
 
Mensagens: 305
Registrado em: 11 Out 2006 20:53
Localização: Campinas - SP


Voltar para Cypress

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x