Controlar frequencia de uma senoide

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Controlar frequencia de uma senoide

Mensagempor Guri » 03 Set 2010 22:29

É o seguinte: Meu professor pediu para fazer-mos um pequeno projéto que consta de:

Montar uma tabela com 256 pontos afim de gerar uma senoide, em memória quer seja de programa ou externa tipo 24LC64, utilizando um pic16F877A. Essa senoide esta saindo via DAC r2r convencional com amplitude de 5v pk pk.

Até aí tudo bem, o problema é que ele pediu para nós fazermos essa senoide variar a frequencia entre 1khz e 2khz em passos de 10 hz.

Eu pergunto, alguém pode me ajudar: Não tenho a mínima idéia de como alterar a senóide de forma a ela produzir a variação de frequencia propósta, eu pergunto se é possível variar a frequencia "mexendo" na tabela?

Grato
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Mensagempor rafael.wachter » 04 Set 2010 01:23

vc vai ter uma tabela de 256 valores de 8 bits q vai ser "jogado" para um port do PIC, esses 256 valores vão constituir um período da onda senoidal
portanto, para 1KHz o periodo eh de 1ms, como nesse tempo vc terá q colocar os valores no port:

1ms/256 = 3,90625µs

ou seja, para 1KHz a cada 3,9µs vc pega o próximo valor da tabela e joga no port
Se vc diminuir esse tempo consequentemente vai aumentar a frequência.

Exemplo: Pegamos como tempo de atualização 2µs, a cada 2µs coloco um novo valor da tabela no port onde está a malha R2R

256*2µs = 512µs = período da onda
1/512µs = 1953,12Hz


Eu faria desta maneira, mas como na programação se acha diversas maneiras para fazer algo, pode ser q alguém tenha uma ideia melhor :)
Any program which runs right is obsolete.
Avatar do usuário
rafael.wachter
Nibble
 
Mensagens: 89
Registrado em: 19 Nov 2008 13:12
Localização: no RS tchê

Mensagempor renatokodaira » 04 Set 2010 09:04

Use DDS (direct digital synthesis), com esse algoritmo voce consegue resoluçoes de frequencias ateh menores do que os 10Hz de passo que o seu professor pediu. Na revista Circuit Cellar 217 de agosto 2008 tem um bom artigo que explica o funcionamento.

Em resumo a tecnica DDS consiste em se variar o incremento da fase em que voce avança na tabela da forma de onda, para variar a frequencia do sinal de saida. Pode parecer complicado, mas com figuras e explicaçao detalhada voce vai perceber que eh simples.

Basicamente voce precisaria do microcontrolador, de um conversor DAC R-2R, da tabela de 256 pontos (que pode ser no proprio PIC) e o resto eh tudo por software.

Aqui tambem tem um bom material:
http://www.ieee.li/pdf/essay/dds.pdf
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Mensagempor Guri » 06 Set 2010 10:54

Obrigado pelas respostas, estou estudando todas.

O rafael você não errou na conta: 1 ms é igual a 1.000us então me corrija por favor se eu estiver errado: 1000\256 (que é o tamanho da minha table seno) = 3,9 milesegundos...

Pelo que lí até agora essa técnica é o princípio de um DDS...

Se alguém tiver mais dicas por favor ajudem,
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Mensagempor Djalma Toledo Rodrigues » 06 Set 2010 11:19

rafael.wachter escreveu:vc vai ter uma tabela de 256 valores de 8 bits q vai ser "jogado" para um port do PIC, esses 256 valores vão constituir um período da onda senoidalmaneiras para fazer algo, pode ser q alguém tenha uma ideia melhor :)

Podemos simplificar isso já que a Senoide é simétrica
E simplificar mais ainda.

Uma Tabela de 0 a 90° é o suficiente já que ela se repete

O Contrôle se é semi ciclo positivo ou negativo em separado

Fica assim:
O Ponteiro incrementa de 0 a 90°
Decrementa de 90 a 180°
Incrementa de 180 a 270°
Decrementa de 270 a 360°

Não é assim a Função Seno na Trigonometria ?

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Guri » 06 Set 2010 11:27

oi dj, você poderia ser mais prático, eu não entendi a relação do angulo da seno...

estou tentando elaborar um dds, ainda tô meio perdido nas contas...mas chego lá.
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Mensagempor barboza » 06 Set 2010 11:52

Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Djalma Toledo Rodrigues » 06 Set 2010 11:58

Guri

<-------> Emáx Sen de Omega t

ou

<-------> Emáx Sen 2 Pi / T

onde T é o Periodo .

Essas são as Fórmulas para o Calculo da Senóide


Ao construir uma tabela se observa duas coisas:

A Tabela é a mesma qualquer que seja o Periodo

De modo que, seja 1 000 1 010 ou 2 000 Hz
a Tabela é a mesma
só muda a velocidade de leitura


A Tabela é Periódica
Se ela se repete para que monta-la integralmente ?

---------------------------------------------
Zoando:

Normalizando Emáx temos:

1 Sen de Omega t

Passando para Trigometria pura:

1 é o Raio

Omega equivale ao ângulo

t ao tempo para calcular Seno

rsrsrs
------------------------------------------
DJ
Editado pela última vez por Djalma Toledo Rodrigues em 06 Set 2010 14:17, em um total de 9 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor guest2003 » 06 Set 2010 12:30

Guri,

Tem que resolver que unidade quer usar :)

1000us / 256 = 3,90625us

ou 1ms / 256 = 0,00390625ms (claro que é a mesma coisa do de cima)

Seu professor exagerou um pouco no pedido dele hein!?

Voce não vai conseguir fazer isso de forma decente com PIC nao...

A menos que faça em ASM e escolha o Cristal do PIC de forma a favorecer os Inline da vida... mas mesmo assim tenho minhas duvidas...

Qual a frequencia que pretende trabalhar no PIC?

Por exemplo se trabalhar em 20Mhz, tem uma instrucao a cada 0,2us ... ou seja, tem 19.5 instrucoes para cada interacao com o DAC...

Isso em 1Khz... ja em 2Khz... tem 9.76 instrucoes para cada interação...

Se ele for exigente com a precisao da senoide de saida, vai complicar hein! :)

Pior ainda... o correto seria jogar pra fora esta senoide numa frequencia acima da gerada (minimo 2x) e fazer um filtro de recontrucao...

[]'s

PS: Seu professor esta um pouco equivocado, ele pediu uma coisa que nem ele mesmo seria capaz de fazer...
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor MOR_AL » 06 Set 2010 13:22

Guri. A coisa não é fácil, não.
Vamos ver porquê.
Período de uma senóide de 2000Hz = 1 / 2000 = 500,000000us
Período de uma senóide de 1990Hz = 1 / 1990 = 502,512563us
Período de uma senóide de 1980Hz = 1 / 1980 = 505,050505us
.... E por aí vai...
Repare que ele pediu 256 pontos por senóide ou ciclo. Vamos desconsiderar, em princípio, a capacidade de você poder gerar os pontos entre 0º e 90º e usar esses valores para gerar o restante do ciclo.
Se você precisa de 256 valores para cada ciclo, e se essas amostras estiverem igualmente espaçadas, então você teria que atualizar o seu CDA a cada 1/256 do período de um ciclo.
No exemplo da frequência 1990Hz, você teria que atualizar a saída a cada 2us. Na verdade, caso houvesse uma memória externa, como comentado, você teria que endereçar a memória, receber o valor para o uC e exteriorizar para uma porta de 8 bits. Tudo isso em cerca de 2us. É muito difícil.
Ainda pior. É que para gerar a frequência certa, seu sistema teria que ter uma precisão, no tempo, da ordem de nanosegundos, caso contrário o período não representa a frequência desejada.
Acho que o seu professor deve estar querendo mostrar que fazer um projeto simples como esse não é fácil.

Uma possível solução... Lembrando que esse circuito é apenas básico, para mostrar que é possível. Talvez precise de um CDA de 10 bits.

Imagem

A saída do PIC para R8 seria melhor com um CDA R-2R.
Se você ainda quizer uma explicação, estou às ordens.
Mostre ao seu professor.

MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: Controlar frequencia de uma senoide

Mensagempor Djalma Toledo Rodrigues » 06 Set 2010 13:55

Guri escreveu:É o seguinte: Meu professor pediu para fazer-mos um pequeno projéto ...

Traduzindo:
Não falou em Precisão o Professor

De qualquer modo eu como Professor(*) jamais iria pedir aos alunos fazerem algo
ainda não ensinado.

(*) Já fui Instrutor

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor renatokodaira » 06 Set 2010 14:38

Vou fazer os calculos pra voce Guri, pra um DDS com PIC. Nao sei qual PIC voce vai usar e qual a frequencia do clock, mas acho que com 20MHz ainda eh possivel.
O primeiro erro que o pessoal costuma cometer quando quer gerar um sinal a partir de uma tabela eh que querem usar todos os pontos dela (pra isso voce precisa de uma velocidade incrivel para processamento). Com DDS voce nao usa todos os pontos da tabela, mas apenas os pontos que sao escolhidos pelo acumulador de fase.
O seu professor nao obrigou que o projeto use todos os pontos da tabela, apenas que voce tenha uma tabela de 256 posiçoes (angulos ou fases x amplitude) e que o passo seja de 10Hz em 10Hz. Isso somente eh possivel fazer com DDS para velocidade de um PIC.

Os requisitos sao:
- frequencia de 1kHz a 2kHz
- passos de 10Hz
- tabela de 256 pontos

Pelo teorema de Nyquist, voce precisa de pelo menos 2 amostras por ciclo do sinal a ser reconstruido. Entao para 2kHz o inimo seria de 4kHz. Vamos usar 32768Hz para usar no clock do conversor DDS. Isso vai dar pelo menos 16 pontos por ciclo do seu sinal gerado (e mais de 32 pontos para a frequencia menor) e vai ser facil de gerar com qualquer cristal de reloginho.

Para o DDS voce precisa definir um registrador de "n" bits que vai ser seu acumulador de fase (angulo). Para facilitar, defina um registrador de 16 bits (duas posiçoes da RAM do PIC). Com 16 bits voce tera 65536 possibilidades de frequencia. Desse registrador de 16 bits voce vai pegar somente os 8 bits mais significativos para buscar na tabela de pontos do sinal (fase x amplitude).

Entao as contas sao as seguintes:
- Cada incremento do acumulador de fase vai ter um periodo fixo de 1/32768 s = 30,5 us que vai ser dado por uma interrupçao do PIC com base num clock de 32768Hz (externo ou com cristal no TMR1 do PIC).
- A cada interrupçao voce terah 30,5 us / 0,2us = 152 ciclos de instruçoes para realizar o seguinte processamento:
1) pegar os 8MSb do registrador de fase
2) buscar na tabela de pontos, a amplitude correspondente aos 8 bits
3) colocar o valor de amplitude de 8 bits obtido da tabela numa porta do PIC (que esta ligada ao DAC)
4) somar o valor de incremento de fase (que pode ser de ateh 16 bits) ao registrador acumulador de fase (de 16 bits).
5) fazer algum processamento de ler botoes (de aumento/diminuiçao) de frequencia alterando o valor de incremento de fase
6) esperar pela nova interrupçao

Por exemplo: voce define o incremento de fase em 2000 (registro de 16 bits). Assim o acumulador de fase vai aumentando de 2000 em 2000 a cada 30,5 us. Voce pega somente os 8 bits mais significativos e busca a amplitude correspondente na tabela. Com esse incremento do acumulador a frequencia de saida vai ser de 1kHz. Veja que com isso voce vai usar somente 32,7 pontos (65536/2000) da sua tabela por ciclo do sinal de saida.

Se voce definir o incremento de fase em 2020, o acumulador de fase vai aumentar de 2020 em 2020, gerando um sinal de 1010Hz na saida do DAC. Voce vai usar 32,4 pontos (65536/2020) por ciclo do sinal de saida.

Veja que voce tem uma resoluçao de 0,5Hz, pois cada unidade de incremento de fase permite 0,5Hz de variaçao.

Finalmente se usar 4000 de incremento de fase, o sinal de saida serah de 2000Hz, usando apenas 16,3 pontos (65536/4000) da tabela, ainda suficientes para atender o teorema de Nyquist.

Ou seja, com o DDS voce nao varia o tempo entre cada ponto dos 256 da tabela, mas varia o salto entre fases da tabela a um periodo fixo de 30,5 us. Esse eh o segredo.
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Mensagempor Guri » 06 Set 2010 14:48

oi moral e dj, muito obrigado pela atenção de vocês.


Então moral se eu entendi você esta sugerindo em seu diagrama elétrico utilizar um PLL é isso mesmo, tendo o pic como controlador do laço?

Então dj meu professo é do tipo meio doidão...em relação aprecisão não precisa ter, é claro que quanto mais preciso for melhor...

Na verdade ele disse que poderiamos utilizar 3 tipos de processadores, Pic, Avr ou Freescale...eu optei pelo pic porque já tenho alguma intimidade com o mesmo e o sw pode ser tanto em asm quanto em c.

Bom eu tive uma idéia analizando o post do nosso amigo que sugeriu a utilização de DDS.

Bom eu ainda não consegui digerir a idéia de como e onde colocaria o "ACUMULADOR DE FASE" que é um contador binário...

Se eu puder gerar uma frequencia fixa e utilizar esse ACUMULADOR (16 bits eu acho que tá bom) e assim poder ir adcionando os valores de deslocamento de frequencia afim de poder ter linearidade sobre a tabela...

Bom só para resumir, foi proposto utilizar uma tabela de 256 pontos afim de gerar uma senoide e poder variar a frequencia da senoide entre 1khz e 2khz em passos de 10hz, usar um DAC 2r2 comum para expor o sinal analogico...

OLha, eu pensei que era simples isso, mas pelo que veja é bem complexo mesmo, mas acredito que se o professor propôs esse projéto é porque deva ser possível, deve haver um método para isso...

Agradeço a ajuda de vocês.
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Mensagempor renatokodaira » 06 Set 2010 15:25

O registrador acumulador de fase nao eh um contador binario. Ele eh um acumulador. Se voce usar um PIC, ele vai ser simplesmente uma variavel WORD de 16 bits), nada mais do que isso, do qual voce pega os 8 bits mais significativos para buscar a amplitude na tabela de 256 pontos (ou fases).
Para o incremento de fase (passos em que o registrador acumulador de fase eh aumentado), voce usa outra variavel WORD de 16 bits. Ele eh quem define a frequencia de saida.

Eh perfeitamente possivel fazer o que o seu professor pediu. Tem um projeto de gerador de funçoes usando essa tecnica DDS e um pic 16F870 em:

http://mondo-technology.com/ e busque Function Generator a esquerda

Soh que os passos nao sao de 10Hz, mas 1Hz.
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Mensagempor guest2003 » 06 Set 2010 15:57

Perfeito Renato...

So que o Professor atirou no que viu e acertou no que nao viu ! hehehee

Duvido que a intenção dele foi essa... Duvido mesmo.

Mas voce esta perfeito, sempre utilizei DDS em CIs dedicados, nunca tinha parado para ver o quão simples era utilizar a mesma tecnica nos processadores.

Muito bem colocado.

[]'s

PS: Continuo com a mesma opniao eheheh se pedir pra ele fazer ele nao faz! (O Prof!)
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Próximo

Voltar para PIC

Quem está online

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

cron

x