Embedded Signal Processing 

Project 3: ADC and Clocks


Overview

M.S. students randomized groups of two each week, never working with same student, unless otherwise directed by instructor.
Ph.D. students have option to choose their groups (all Ph.D. or mix), with or without randomization.


The objective of this project is to become familiar with:

NOTE: Use the Project Report Template and see below for minimum required data content your reports and demos.

IN NO CASE may code or files or data or pictures be exchanged between student groups, there is to be NO COPYING of group reports!
Also, each student must be able to independently answer any questions themselves during demos.
All students are expected to learn all aspects of every project.
Nevertheless, students are encouraged to collaborate (not copy) during the lab sessions.



Part 1, ADC Programming

zz
Fig. 1
zz
Fig. 2
#include "mbed.h"
DigitalOut gpo(D0);
DigitalOut led(LED_RED);
AnalogOut  dac0out(DAC0_OUT);
AnalogIn  adc0in(A0); //A0 = PTB2

int main()
{
    uint32_t mask16=1<<16;
    uint32_t dat1=(PTC->PDOR) | mask16; //set Port Data Output Register
    uint32_t dat0=(PTC->PDOR) & (!mask16); //clear
    uint16_t tpAdc0in=1;
   
    DAC0->C0 = 0; //reset state
    DAC0->C1 = 0;
    DAC0->C0 = DAC_C0_DACEN_MASK      // Enable
               | DAC_C0_DACSWTRG_MASK   // Software Trigger
               | DAC_C0_DACRFS_MASK;    // VDDA selected
 
       while (true)
        {
         //example using write to a single bit, DOarduino=PTC16
         (PTC->PDOR)=dat0; //clear
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat0; //clear
          tpAdc0in=adc0in.read_u16();
          wait((float)(0.001e-6));
          DAC0->DAT[0].DATL = (uint8_t)((uint16_t)(tpAdc0in>>4)      & 0xFF);
          DAC0->DAT[0].DATH = (uint8_t)(((uint16_t)(tpAdc0in>>4) >> 8) & 0x0F);
          wait((float)(0.001e-6));
        }
 
}


z
Fig. 3


zz
Fig. 4
z
Fig. 5
zz
Fig. 6


#include "mbed.h"
DigitalOut gpo(D0);
DigitalOut led(LED_RED);
AnalogOut  dac0out(DAC0_OUT);
AnalogIn  adc0in(A0); //A0 = PTB2

int main()
{
    uint32_t mask16=1<<16;
    uint32_t dat1=(PTC->PDOR) | mask16; //set Port Data Output Register
    uint32_t dat0=(PTC->PDOR) & (!mask16); //clear
    uint16_t tpAdc0in=1;
   
    DAC0->C0 = 0; //reset state
    DAC0->C1 = 0;
    DAC0->C0 = DAC_C0_DACEN_MASK      // Enable
               | DAC_C0_DACSWTRG_MASK   // Software Trigger
               | DAC_C0_DACRFS_MASK;    // VDDA selected
 
       while (true)
        {
         //example using write to a single bit, DOarduino=PTC16
         (PTC->PDOR)=dat0; //clear
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat0; //clear
          tpAdc0in=adc0in.read_u16();
         (PTC->PDOR)=dat0; //clear
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat0; //clear
          wait((float)(0.1e-6));
          DAC0->DAT[0].DATL = (uint8_t)((uint16_t)(tpAdc0in>>5)      & 0xFF);
          DAC0->DAT[0].DATH = (uint8_t)(((uint16_t)(tpAdc0in>>5) >> 8) & 0x0F);
          wait((float)(0.1e-6));
        }
 
}
z
Fig. 7


Part 2, Adjusting the System Clocks for Faster ADC Speed

 #include "mbed.h"
DigitalOut gpo(D0);
DigitalOut led(LED_RED);
AnalogOut  dac0out(DAC0_OUT);
AnalogIn  adc0in(A0); //A0 = PTB2
Serial pc(USBTX, USBRX);

int main()
{
 if(1){
    uint32_t div1=0,div2=0,busClk=0,adcClk=0;
    SystemCoreClockUpdate();
    pc.printf("SystemCoreClock= %u \r\n",SystemCoreClock);
    div1=( (SIM->CLKDIV1) & SIM_CLKDIV1_OUTDIV1_MASK)>>SIM_CLKDIV1_OUTDIV1_SHIFT;
    div1=1+div1;
    div2=1+( (SIM->CLKDIV1) &    SIM_CLKDIV1_OUTDIV2_MASK)>>SIM_CLKDIV1_OUTDIV2_SHIFT;
    busClk=SystemCoreClock*div1/div2;
    pc.printf("Divider1== %u div2=%u \r\n",div1,div2);
    pc.printf("MCGOUTCLK= %u,  busClk = %u \r\n",SystemCoreClock*div1,busClk);
    ADC0->SC3 &= ~ADC_SC3_AVGE_MASK;//disable averages
    ADC0->CFG1 &= ~ADC_CFG1_ADLPC_MASK;//high-power mode
    ADC0->CFG1 &= ~0x0063 ; //clears ADICLK and ADIV
    ADC0->CFG1 |= ADC_CFG1_ADIV(1); //divide clock 0=/1, 1=/2, 2=/4, 3=/8
    if (((ADC0->CFG1)& 0x03) == 0) adcClk = busClk/(0x01<<(((ADC0->CFG1)&0x60)>>5));
    if (((ADC0->SC3)& 0x04) != 0) adcClk = adcClk/(0x01<<(((ADC0->SC3)&0x03)+2));
    pc.printf("adcCLK= %u  \r\n",adcClk);
    }
   
    uint32_t mask16=1<<16;
    uint32_t dat1=(PTC->PDOR) | mask16; //set Port Data Output Register
    uint32_t dat0=(PTC->PDOR) & (!mask16); //clear
    uint16_t tpAdc0in=1;
   
    DAC0->C0 = 0; //reset state
    DAC0->C1 = 0;
    DAC0->C0 = DAC_C0_DACEN_MASK      // Enable
               | DAC_C0_DACSWTRG_MASK   // Software Trigger
               | DAC_C0_DACRFS_MASK;    // VDDA selected
 
       while (true)
        {
         //example using write to a single bit, DOarduino=PTC16
         (PTC->PDOR)=dat0; //clear
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat0; //clear
          tpAdc0in=adc0in.read_u16();
         (PTC->PDOR)=dat0; //clear
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat1; //set
         (PTC->PDOR)=dat0; //clear
          //wait((float)(0.1e-6));
          DAC0->DAT[0].DATL = (uint8_t)((uint16_t)(tpAdc0in>>4)      & 0xFF);
          DAC0->DAT[0].DATH = (uint8_t)(((uint16_t)(tpAdc0in>>4) >> 8) & 0x0F);
          //wait((float)(0.1e-6));
        }
 
}


z
Fig. 8
z
Fig. 9
z
Fig. 10

Report Data

              


Report:


Copyright  2015 T. Weldon

Freescale, Kinetis are registered trademarks of Freescale Semiconductor, Inc.   Texas Instruments, TI, C2000, and Code Composer Studio are a registered trademarks of Texas Instruments Incorporated.   Adafruit is a registered TradeMark of Limor Fried.  ARM, Cortex and Keil are registered trademarks of ARM Limited (or its subsidiaries).  Apple, Yosemite, Mac OS, iPhone, iPad, MacBook, Mac, iTunes, and Xcode are trademarks of Apple inc. All other product or service names are the property of their respective owners.  Arduino is a registered trademark of Arduino.