• 1
  • 2

ADC prevodník, trimrom ovládame blikanie LED #1

. .

ADC prevodník, trimrom ovládame blikanie LED.

 

Predtým než začneme chcem podotknúť, že mi dlhšiu chvíľu trvalo kým som rozchodil ADC prevodník a pochopil všetku jeho konfiguráciu. V tomto článku navrhneme projekt pre ovládanie intenzity blikania LED diody.

Doporučujem dopodrobna preštudovať tutoriál priamo od MicroChipu. Ten si stiahnete tu:

Download



Aby sme nejako začali hlavná myšlienka je tá, že chceme analogový (spojitý) signál previesť na signál diskrétny (digitálny), a ten následne spracovať. K tomu nám slúži Analogovo/Digitálny prevodník. Prevod signálu spočíva vo vzorkovaní a následne kvantovaní signálu.

Náš procesor PIC24FJ64(GA/GB)002 obsahuje 10 bitový ADC prevodník s 13-nástimi kanálmi.

Tie sú:

Porty / Piny


AN0 / RA0
AN1 / RA1
AN2 / RB0
AN3 / RB1
AN4 / RB2
AN5 / RB3
AN9 / RB15
AN10 / RB14
AN11 / RB13

 

 




Pre prácu snimi si je nutné ozrejmiť úlohu jednotlivých SFR registrov.

AD1PCFG – Definuje či jednotlivé piny majú byť nastavené ako analogové alebo digitálne.

AD1CON1 – Určuje, či je ADC zapnuté alebo vypnuté; výstupný formát konverzie; generátor signálu "štartová konverzia"; či ADC neustále vykonáva konverzie alebo len robí jednu sekvenciu vzoriek; a či odber vzoriek začína znova ihneď po ukončení predchádzajúcej konverzie alebo čaká na signál od používateľa. Tiež označuje, či bola ukončená posledná konverzia.

AD1CON2 – Určuje referencie napätia pre ADC (pozitívna referencia by mohla byť 3,3 V alebo VREF +, negatívna referencia by mohla byť GND alebo VREF-); či budú vstupy skenované alebo nie; či sa v striedavom režime použijú MUX A a MUX B; či je vybratý režim duálneho vyrovnávacej pamäte; a počet konverzií, ktoré sa majú vykonať pred vytvorením prerušenia.

AD1CON3 – Určuje, či je Tad generovaný z interných RC hodiniek ADC alebo hodín PB; počet cyklov Tad na odber vzorky signálu; a počet cyklov Tad povolených na konverziu každého bitu (musí byť najmenej 65 ns).

AD1CHS – Tento SFR určuje, z ktorých pinov sa budú odoberať vzorky ("pozitívne" kanály) a to, či sa budú porovnávať (VREF alebo analógový vstup 1). V režime skenovania sa piny špecifikované v tomto SFR ignorujú.

AD1CSSL – Tento SFR indikuje, ktoré analógové vstupy budú vzorkované v režime skenovania (ak sme AD1CON2 nakonfigurovali pre ADC, pre režim skenovania).

Pre príklad som vychádzal z jedného japonského článku: >>článok<<

Schéma zapojenia: SCHÉMA.


Ukážkový kód:

main.c


#include "config_diall.h"    // http://www.diallix.net/headers
#include "config_words.h" // http://www.diallix.net/headers
char *PageSys(void)
{
return "0x21";
}

unsigned long ADCValue = 0;

int main(void)
{
CLKDIV = 0;
//Init_Port2(PORTB, 2, "analog");   /* Set AN4 as analog */
AD_Set_Analog(AN4);                 /* Set AN4 as analog */
Set_ADC_port(AN4);                   /* Set AN4 port for scanning */
Config_OUT(TRISA,0);                /* Set RA0 for detect LED */
T3CON=0b1000000000110000/* 50msec, 1/256,FOSC=16MH, Current time clock */
PR3 = 3124; /* 50000 ·((1/16) —256)-1 = 3124 */

AD1CON1 = 0x8044; /* AD1CON1:A/D1 Configure sample clock source
                                    and conversion trigger mode.
                                    Unsigned Fraction format (FORM<1:0>=10),
                                    Manual conversion trigger (SSRC<3:0>=000),
                                    Manual start of sampling (ASAM=0),
                                    No operation in Idle mode (ADSIDL=1) */

AD1CON2 = 0x0400; /* AD1CON2:A/D2; 31Tad 3.0Tcy
                                    Configure A/D voltage reference
                                    and buffer fill modes.Vr+ and Vr- from
                                    AVdd and AVss (VCFG<2:0>=000),
                                    Inputs are not scanned,
                                    Interrupt after every sample */

AD1CON3 = 0x0000; /* AD1CON3:A/D3; MUX A
                                    Configure A/D conversion clock as Tcy/2 */

AD1CHS = 0x0000 /* AD1CHS:A/D
                                   Configure input channels */

IEC0bits.AD1IE = 1; /* Enable A/D conversion interrupt */
AD1CON1bits.ADON = 1; /* Turn on A/D */
AD1CON1bits.ASAM = 1; /* Sampling begins immediately after the last conversion */
AD1CON1bits.SAMP = 1; /* Start sampling the input */

Delay_us(50);
while(1)
  {
     Delay_ms(ADCValue);
     Bit_Toogle(LATA, 0);
  }

return 0;
}

void __attribute__((interrupt,auto_psv)) _ADC1Interrupt(void) /* interrupt thread */
{
   ADCValue = ADC1BUF0; /* Get data from buffer0 */
   IFS0bits.AD1IF = 0; /* ADC flag set 0 */
}

 

 




Za pomoc pri článku sa chcem osobne poďakovať užívateľovi Mahoney z fóra: >>forum<<

 

 

Video: