Biblioteca DAC para FRDM-KL25Z

Periodic Interrupt Timer

Olá caro leitor, este é mais um artigo da série Bibliotecas de Software para a FRDM-KL25Z. Neste artigo será feita uma breve introdução sobre conversor digital analógico, apresentar a biblioteca DAC de software para a utilização deste periférico e um exemplo de aplicação.

 

 

Introdução

 

Um sistema de Processamento de Sinais Digitais (PDS), de maneira bem simples, pode ser dividido em três blocos, são eles: aquisição do sinal e conversão, processamento digital do sinal e reconstrução do sinal.

 

Diagrama de bloco Processamento Digital de Sinal - Biblioteca DAC
Diagrama de bloco Processamento Digital de Sinal

 

Aquisição de sinal é a primeira etapa de um processamento digital de sinais, responsável por traduzir o sinal analógico que varia continuamente em uma série de níveis discretos. Essa etapa é composta por filtros e conversor analógico-digital (ADC).

 

O segundo item é a etapa de processamento digital, é neste bloco que serão realizadas todas as operações tais como: remoções de interferências indesejadas; aumento ou redução de amplitude ou da frequência; entre outras operações. De acordo com a aplicação, essa tarefa pode ser realizada por um DSP - Digital Signal Processor (Processador de Sinais Digitais), microprocessador ou microcontrolador.

 

O último item de um sistema de processamento digital de sinais é a parte responsável pela a reconstrução do sinal. Essa etapa fica a cargo de um Conversor Digital-Analógico (DAC). O DAC transforma uma série de códigos digitais, que representa um sinal analógico.

 

Para mais informações a respeito de processamento digital de sinais, recomendo a série de artigos Processamento Digital de Sinais - DSP produzidos pelo Henrique Puhlmann.

 

 

DAC - Característica e Desempenho

 

As principais características de conversor digital-analógico incluem resolução, precisão e linearidade. Resolução de DAC é expressa pela a equação abaixo:

 

Cálculo de resolução do DAC

 

Onde n é número de bits. Também pode-se obter a percentagem, expresso pela equação:

 

Cálculo porcentual do DAC

 

Precisão é deduzida da comparação da saída real com a saída esperada.

 

Linearidade ou erro linear é um desvio a partir de uma reta ideal de saída de DAC. Um exemplo é o erro de Offset, o qual corresponde ao valor de tensão de saída quando o valor de entrada é zero.

 

 

DAC da Freedom Board KL25Z

 

O microcontrolador MKL25Z128VLK4 possui um conversor digital-analógico de 12 bits. O sinal do DAC pode ser configurado para um pino externo ou para um comparador analógico. Também pode ser utilizado em conjunto com o DMA (Direct Memory Access).

 

Diagrama de bloco DAC da FRDM-KL25Z
Diagrama de bloco DAC da FRDM-KL25Z

 

O primeiro item a ser configurado é habilitar o Clock ao periférico. Essa operação é feita utilizando o registrador System Clock Gating Control Register 6 (SIM_SCGC6). Para habilitar o Clock deve-se utilizar a macro SIM_SCGC6_DAC0_MASK.

 

Detalhes do Registrador System Clock Gating Control Register 6 (SIM_SCGC6)
Detalhes do Registrador System Clock Gating Control Register 6 (SIM_SCGC6)
Bit do registrador SIM_SCGC6 responsável por habilitar o Clock ao DAC
Bit do registrador SIM_SCGC6 responsável por habilitar o Clock ao DAC

 

O segundo registrador que devemos configurar é DAC Status Register (DACx_SR).

 

Registrador DAC Control Register (DACx_C0)
Registrador DAC Control Register (DACx_C0)

 

O terceiro registrador a ser configurado é DAC Control Register (DACx_C0).

 

 

 

 

Escrevendo no DAC

 

Para realizar a escrita no conversor digital-analógico devemos utilizar dois registadores, são eles: DAC Data Low Register (DACx_DATnL) e DAC Data High Register (DACx_DATnH). O primeiro é destinado para escrever os 8 bits menos significativos e o segundo registrador é para escrever os 4 bits mais significativos.

 

Registrador DAC Data Low (DACx_DATnL)
Registrador DAC Data Low (DACx_DATnL)
Registrador DAC Data High (DACx_DATnH)
Registrador DAC Data High (DACx_DATnH)

 

 

Biblioteca de Software DAC

 

Demonstrarei a seguir a biblioteca de software com as configurações mínimas para utilizar o conversor digital-analógico, apresentando a função de inicialização e de escrita.

 

Nota I: O pino destinado para conversor digital-analógico é PTE30.

 

Pino de saída externa do DAC
Pino de saída externa do DAC

 

Nota II: O sinal do proveniente do conversor digital-analógico também pode ser direcionado para outro periférico do microcontrolador.

 

Função de inicialização do DAC e Escrita 

 

Arquivo dac.c

/*
 * dac.c
 *  Created on: 17/10/2017
 *      Author: Evandro Teixeira
 */
#include "dac.h"

/****************************************************************************************
*
*****************************************************************************************/
void dac_Init(void)
{
	// DAC0 clock enabled
	SIM_SCGC6 |= SIM_SCGC6_DAC0_MASK;

	// Clear status register
	DAC0_SR = 0x00;

	// The DAC system is enabled
	DAC0_C0 = DAC_C0_DACEN_MASK ;
}
/****************************************************************************************
*
*****************************************************************************************/
bool dac_Output(uint16_t value)
{
	uint8_t msb = 0;
	uint8_t lsb = 0;

    if(value < 4096)
    {
    	msb = (uint8_t)(value >> 8);
    	lsb = (uint8_t)(value);

    	DAC0_DAT0L = lsb;
    	DAC0_DAT0H = msb;

    	return true;
    }
    else return false;
}
/****************************************************************************************/

 

Arquivo dac.h

/*
 * dac.h
 *
 *  Created on: 17/10/2017
 *      Author: evandro
 */

#ifndef SOURCES_DAC_H_
#define SOURCES_DAC_H_

#include "MKL25Z4.h"
#include "stdbool.h"

void dac_Init(void);
bool dac_Output(uint16_t value);


#endif /* SOURCES_DAC_H_ */

 

 

Aplicação

 

A aplicação com conversor digital-analógico consiste em gerar sinal analógico que se assemelhe ao sinal cardíaco.

 

main.c

/*
 * main.c
 *
 *  Created on: 17/10/2017
 *      Author: evandro
 */
#include "MKL25Z4.h"
#include "stdbool.h"
#include "dac.h"

const uint16_t vetor[29] =
{403,404,450,500,700,900,1100,1000,900,700,500,409,450,500,1500,
3000,4095,3000,1200,500,100,0,100,450,500,500,500,550,500};
uint32_t i = 0;
uint8_t index = 0;

int main(void)
{
    /* Write your code here */
    /* This for loop should be replaced. By default this loop allows a single stepping. */

	dac_Init();
	for (;;)
    {
		dac_Output(vetor[index++]);
		if(index >= 29)
			index = 0;
        for(i=0;i<100000;i++);
    }
    /* Never leave main */
    return 0;
}

 

Representação do sinal analógico
Representação do sinal analógico

 

 

Conclusão

 

Neste artigo foi apresentada mais uma biblioteca de software para a Freedom Board KL25Z utilizando o periférico DAC - Conversor Digital Analógico. O arquivos aqui apresentado estão disponíveis neste Github.

 

 

Referências

 

Sistemas Digitais Fundamentos E Aplicações 9ª Edição, THOMAS L. FLOYD - Capitulo 13.

Reference Manuals KL25Z

Github - Library-FRDM-KL25Z

Outros artigos da série

<< PIT - Periodic Interrupt Timer para FRDM-KL25ZBiblioteca de Software de DMA para FRDM-KL25Z >>
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Evandro Teixeira
Desenvolvedor de Sistemas Embarcados. Sou formado Técnico em Instrumentação e Automação Industrial/Mecatrônica pelo Colégio Salesiano Dom Bosco de Americana-SP, cursei o Engenharia Elétrica com Ênfase em Eletrônica pela UNISAL Centro Universitário Salesiano de São Paulo e atualmente estou cursando Superior de Tecnologia em Análise e Desenvolvimento de Sistemas pela UNIP Universidade Paulista.

2
Deixe um comentário

avatar
 
1 Comment threads
1 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
Evandro TeixeiraRoitter Konrad Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Roitter Konrad
Visitante
Roitter Konrad

Por favor, poderia me explicar mais detalhadamente a parte do código, mbs = (uint_t) (valeu>>8)