Ir ao conteúdo
  • Cadastre-se

Alterando amplitude no pic


Posts recomendados

Alguém sabe me dizer se é possível fazer com que o pic em sua saída analógica ,comece com um sinal de 5 volts e desça gradualmente até 0 volts?

Estou precisando de um sinal em uma determinda frequência onde eu possa baixar a amplitude mas sem mexer no período, comece com 5 volts e vá descendo até 0 volts em 1,5 segundos?

Link para o comentário
Compartilhar em outros sites

@fabiano aladin,

 

Com um bom programa, o céu é o limite, meu amigo ! Usando os 8 bits de uma porta, voce pode obter qualquer tensão entre 0 e a tensão de referência do conversor D/A. Ou seja, pode variar entre 0 e +5v com 256 níveis, sem nenhuma grande dificuldade.

 

Existe um componente muito interessante que é um potênciômetro programável. Com ele voce ajusta como quiser, usando o microcontrolador.

 

Também pode utilizar um conversor D/A , onte voce pode regular a tensão de referência, usando um desses potenciômetros programáveis.

 

Ou pode queimar bastante a cabeça, fazendo o ganho de algum circuito variar linearmente nesse seu tempo de 1,5 segundos, para atenuar progressivamente uma determinada forma de onda aplicada à sua entrada.

 

 

Paulo

Link para o comentário
Compartilhar em outros sites

Obrigado pela ajuda, dei uma olhada na conversão e vai me servir para futuros projetos, porém no momento tenho que fazer uma onda quadradada de uma determinada frequência permanecer com essa frequência , porém ir reduzindo sua amplitude gradualmente de 5 volts a zero volts.Tô tentando  pensar em uma maneira mas nem imagino  o que devo usar e estudar para conseguir . Tenho que fazer com pic(microcontrolador) .

Link para o comentário
Compartilhar em outros sites

Dê mais detalhes sobre esse projeto:

Porque você quer alterar a amplitude de um sinal de onda quadrada?

O sinal vem de uma fonte externa ou o PIC gera ele?

Qual a frequência do sinal? É fixa?

Essa onda quadrada precisa ter a faixa negativa ou de 0 a 5v já serve?

Qual o duty cycle?

Link para o comentário
Compartilhar em outros sites

@vtrx e @Projetos_afg

 

Caramba, acho melhor passar num terreiro de macumba.... são dois ressucitados, o Projetos_afg e o SOSChip ..... !

 

Sei não Vtrx, vamos nos cuidar kkkkkk !

 

Paulo


@fabiano aladin

 

Use um conversor R/2R para obter a sua tensão, que vai limitar a forma de onda. Pegue essa saída do R/2R, e aplique ela em um amp op apenas para diminuir a impedância e poder fazer um ajuste fino de ganho. E também aplique a saída de uma porta do Pic na realimentação do Amp Op, para cortar o sinal ou deixar o sinal aparecer na saida dele. É justamente essa porta do Pic que tem de gerar a onda quadrada da frequência que voce quiser. Use o Timer para isto.

 

É bem simples, acredite ! 

 

Paulo

Link para o comentário
Compartilhar em outros sites

Pessoal obrigado pela ajuda, o caso é que preciso de 3 frequências diferentes para gerar 3 sons diferentes e acionados separadamente , e todas  feitas pelo pic , as 2 primeiras andei pesquisando e já sei o caminho que deverei fazer para conseguir , a terceira é de 450hz e o período não me lembo agora, ela deve vir abaixando até zerar , ou seja sua amplitude forma uma rampa para gerar um determinado som,sou iniciante em pic e necessito para o trabalho e também vai ser um ótimo exercício para mim ,  essa frequência de 450hz que é a mais complicada e nem imagino como farei ela.A frequência deve ser fixa sim , sinal positivo de 0v a 5V,o sinal é gerado pelo pic, e deve vir baixando progressivamente até chegar a 0V .E também  me interessei pelo potenciômetro programável só que não achei nada sobre ele na internet , alguém pode me mandar um site onde eu possa ler a respeito ?

Link para o comentário
Compartilhar em outros sites

@fabiano aladin

 

Simples de serem feitas todas essas frequências. Use os timers para isso. Se precisar de alguma frequência muito exata, voce pode usar o famoso PLL por software para conseguir, mudando a contagem inicial do timer de tempos em tempos.

 

Para baixar a amplitude, voce vai fazer como eu disse acima, diminuindo o número na saída onde está o conversor R/2R .

 

Um excelente site sobre os digital pots :

 

http://www.maximintegrated.com/products/data_converters/digi-pot/

 

Paulo

Link para o comentário
Compartilhar em outros sites

Alterei o projeto e vou trabalhar com capture e compare mas estou completamente perdido em como fazer para gerar uma frequência onda quadrada no pic.Sou iniciante  e não encontro nada explicativo sobre como fazer para o compare funcionar como oscilador e gerar a onda quadrada na frequência q desejo.

Link para o comentário
Compartilhar em outros sites

@fabiano aladin,

 

Nossa capture e compare para gerar uma onda quadrada ?

E como vai determinar a frequência ?

 

Até eu estou completamente perdido com essa ideia que te deram ! Tem maneira bem mais simples....

 

Mas dá para fazer :

 

http://ww1.microchip.com/downloads/en/DeviceDoc/ccpwm.pdf

 

Se quiser ir pelo caminho mais complicado : o Timer também faz PWM, basta programar os counters para gerar período de 50% do PWM.

 

 

Se conselho fosse bom, não se dava, se vendia.... mas meu conselho é este :

 

Não invente. Use os Timers. Servem exatamente para isso que voce quer. Programe as interrupções em função dos períodos de suas ondas quadradas. Muito fácil de se implementar.

 

Paulo

Link para o comentário
Compartilhar em outros sites

Peguei o tópico por cima mas vamos, lá conversor D/A de 1bit não compensaria ai senhores? PWM + filtro ativo? é um hardware mais barato e mais fácil de montar, o único problema mesmo são os parâmetros da portadora do PWM do PIC (que não é lá grandes coisas) mas dependendo da largura de banda da pra implementar qualquer forma de onda atraves de uma tabela mapeada em memoria com a forma da função desejada.

Irem ler melhor e qualquer coisa edito meu post.

Abs.

Link para o comentário
Compartilhar em outros sites

@aphawk

 

Correto! Como a resolução vertical de um gerador de sinais raramente ultrapassa os 8bits, acho o PWM uma solução que oferece alguma qualidade, além de ser mais barato e fácil de montar do que D/A baseada em string de resistores (sem contar que precisa daquele seguidor de tensão na saída pra não sobrecarregar o D/A).

 

Obviamente ele precisa ser bem projetado, senão o resultado não fica legal, mas pelo que entendi do tópico o que o @fabiano aladin quer é uma simples saida de tensão variável do terminal do PIC, agora pergunto o que esse sinal vai alimentar?

Abs.

Link para o comentário
Compartilhar em outros sites

Preciso que o pic me forneça 3 frequências ,para soar um alarme ,com 3 sons diferentes e acionados por chaves distintas e só param quando o botão  for solto , somente uma terá a opção de ter um tempo , o problema de alterar amplitude foi resolvido,vai sair um outro tipo de frequência, meu problema é que sou iniciante , e 2 frequências consigo fazer com simples delay,não sei se é a melhor maneira.

A terceira tenho que fazer com timer , li uns posts aqui sobre o tema e me ajudou muito , mas mesmo assim preciso estudar mais sobre timers e não sei por onde começar a fazer tal código.Estou utilizando o 16f877 e o compilador ccs.

minha pergunta é se posso usar o oscilador de 4000000Mhz( oscilador de cristal que vai conectado as portas do pic) externo do pic , para usar como referância ou tenho q usar uma alimentação externa como referência ?

E obrigado a todos pela ajuda que estou recebendo de todos aqui!

Link para o comentário
Compartilhar em outros sites

@fabiano aladin,

Se o problema da amplitude foi resolvido, vamos aos problemas das frequencias...

veja, voce pode utilizar um timer de base,  e configurar ele para uma interrupção periodica, nessa interrupção, aloque 3 contadores cada qual com seu limite de contagem  que corresponderá a frequencia... a cada interrupção incremente esses contadores e compare com o limite, caso seu valor fique igual ou maior que o limite, voce complementa o estado do pino correspondente ao seu GPIO.

Veja um exemplo GENERICO de como fazer isso:

 

/*****************************************************************	EXEMPLO DE TOOGLE DE 3 GPIOS EM FREQUENCIAS DIFERENTES				By: FSN *******************************************************************/#include <stdint.h> //default caso nao haja tipo padrao//coloque seus includes e fuses abaixo dessa linha://estrutura de um gerador de onda quadrada:typedef struct{	//contador atual do gerador	uint8_t ContadorFreq_ ;		//limite de contagem atual:	uint16_t LimiteFreq_ ;		//GPIO acessado:	uint16_t GPIO;}Gerador_t;//cria 3 estruturas de geradores:Gerador_t Freq1;Gerador_t Freq2;Gerador_t Freq3;//prototipos das funcoes usadas:void IniciaSistema(void);void ModificaFrequencia(Gerador_t *This, uint16_t Freq);void InicializaGerador(Gerador_t *This, uint16_t GPIO);void RodaGerador(Gerador_t *This);//Inicia hardware do microcontrolador:void IniciaSistema(void){	//configura aqui o Timer0 e suas interrupcoes}//Modifica a frequencia do contador:void ModificaFrequencia(Gerador_t *This, uint16_t Freq){	//checa parametros:		//estrutura nao existe	if(This == (Gerador_t *) 0) return;	//valor de frequencia fora do range permitido	if(Freq > 0xFFFF)	return;		//senao, altera a frequencia:	This->LimiteFreq_ = Freq;}//Inicializa o gerador:void InicializaGerador(Gerador_t *This, uint16_t GPIO){	//Checa parametros:		//ponteiro nulo:	if(This == (Gerador_t *) 0) return;		//se o ponteiro é valido, entao inicia:		//Zera contador:	This->ContadorFreq_ = 0;		//Frequencia inicial a mais baixa possivel:	This->LimiteFreq_ = 0xFFFF;		//aponta o GPIO desejado:	This->GPIO = GPIO;}//Roda Gerador(chamado somente na interrupcao):void RodaGerador(Gerador_t *This){	 //temporario:	 uint8_t Temp = 0;	//Checa se o ponteiro é nulo:	if(This == (Gerador_t*) 0) return;		//checa se houve overflow do contador:	if(This->ContadorFreq_ >= This->LimiteFreq_)	{		//le o GPIO(no caso do CCS):		Temp = Input(This->GPIO);				//complementa seu valor:		Temp = ((~Temp) & 0xFF);				//checa estado e escreve o bit:		Temp != 0 ? OutputHigh(This->GPIO) : OutputLow(This->GPIO);				//Zera contador se entrou nesse if:		This->ContadorFreq_ = 0;	}	else	{		//caso contrario nao faz nada	}}//Rotina principalvoid main (void){	// inicializa os geradores alocados:	InicializaGerador(&Freq1, pin_b0);	InicializaGerador(&Freq2, pin_b1);	InicializaGerador(&Freq3, pin_b2);		//Inicializa seu hardware:	IniciaSistema();		//faz uma pre-carga com tres frequencias diferentes:	ModificaFrequencia(&Freq1, 100);	ModificaFrequencia(&Freq2, 250);	ModificaFrequencia(&Freq3, 340);		//habilita as interrupcoes:	//nao lembro como faz no CCS		//loop infinito:	while(1)	{	}}//Sua rotina e interrupcao:void InterrpcaoTimer(void){	//Faca a recarga do timer, como manda o CCS		//Aqui voce chama a funcao dos seus geradores:	//sao 3 entao chamamos para Fre1,2 e 3:		RodaGerador(&Freq1);	RodaGerador(&Freq2);	RodaGerador(&Freq3);		//simples e portavel para outros pics e processadores...}

Veja que é um exemplo que falta preencher com informações do PIC, mas isso executa exatamente o que voce quer, e pode ser usado em qualquer microcontrolador.

Em caso de duvidas, pergunte!

Abs.

Felipe

Link para o comentário
Compartilhar em outros sites

minha pergunta é se posso usar o oscilador de 4000000Mhz( oscilador de cristal que vai conectado as portas do pic) externo do pic , para usar como referância ou tenho q usar uma alimentação externa como referência ?

E obrigado a todos pela ajuda que estou recebendo de todos aqui!

 

Como assim alimentação externa como referência? Uma coisa é o oscilador, outra coisa é a alimentação.

 

Sobre como produzir a frequência, tanto utilizando interrupção por Timers quanto utilizar o módulo PWM vai funcionar. A diferença é que o PWM (por hardware) uma vez configurado você deixa ele gerar a onda quadrada para você, e com os Timers você tem que elaborar uma rotina de interrupção para inverter o estado do pino periodicamente.

 

Que linguagem e que compilador você está utilizando?

Link para o comentário
Compartilhar em outros sites

Me desculpe pela minha ignorância no assunto , depois de pesquisar muito , agora comecei a entender como funciona o timer e as interrupções,e também descobrir que não preciso usar um sinal externo , a não ser a do oscilador para  elaborar as frequências ,tô menos perdido que antes graças a ajuda de todos.Felip_eletronic teve muitas partes do seu código que não entendi , meu objetivo é entender porquê se eu só copiar nunca aprenderei a programar pic!

se alguém puder me explicar um pouco mais sobre o assunto ou me indicar onde aprenderei mais , o suficiente para eu conseguir fazer as 3 frequências.Agradeço a ajuda de todos!

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Alguém poderia me exemplificar e me passar a fórmula para cálculo de postscaler e prescaler , talvez eu utilize os 3 timers do pic 16f877 , com cristal de 4 mhz .Tem algum problema eu usar mais de um tmer para gerar 5 saidas com frequências bem distintas?

uma deverá ter 1khz depois de um certo tempo passar para 600hz , a segunda dá 3 pulsos de 1khz e depois ficar em 0 até um determinado tempo.

estou usando delay para certificar que o botão foi mesmo acionado , usei um delay de 1 segundo!

 Li em um site que usar delay pode dá problema no programa, gostaria de saber a respeito disso também , como explicado ácima usei para os botões?

Link para o comentário
Compartilhar em outros sites

@fabiano aladin,

 

Procure aqui mesmo no fórum, tem vários tópicos sobre o cálculo dos Prescalers conforme a sua necessidade. Procure aqui no fórum, eu mesmo postei os métodos e fórmulas e exemplos, creio que foi em 2009 .... mas tem muitas postagens sobre isto.

 

O timer pode te gerar uma base de tempo. O ideal é que essa base seja um determinado período com o qual voce consiga gerar todas as temporizações das frequências que voce precisa. Assim, voce só usa um único Timer como base de tempo !

 

voce citou 600 Hz, 1 Khz, e 3 Khz . Se voce usar um Timer para atender 3 kHZ, é muito fácil atender as outras, pois :

 

3 Khz corresponde a um período de 333,33 microsegundos. Temos de gerar então uma interrupção a cada 333,33 / 2 = 166,16 microsegundos.

A cada interrupção, voce inverte o estado de uma das saídas, e vai ter a sua frequência de 3 Khz, onda quadrada.

 

1 Khz - pode ser feito contando 3 interrupções do timer ( que gera 3 Khz ), ou seja, só inverto o estado da saída desejada após contar 3 interrupções.

600 Hz - pode ser feito contando 5 interrupções do timer ( que gera 3 khz ), idem acima, após 5 interrupções

 

Percebeu ? basta criar contadores dentro da sua interupção do Timer, e agir conforme a contagem !

 

Quanto ao delay, existe um problema, pois enquanto existir o delay, a CPU não vai fazer outras tarefas. 

 

voce tem de fazer o debounce nos botões ou teclados. 1 segundo é muito tempo. Normalmente se usa 30 milisegundos para isso. Existem algumas técnicas para fazer esse procedimento, e existem vários tópicos sobre isto aqui no Fórum. Este é outro assunto onde eu também fiz um post bem detalhado, mas foi em 2009 ou 2010, quando eu ainda usava os pics....

 

Procure por DEBOUNCE  .

 

Paulo

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...