<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: ADC operating above max speed? in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322301#M14565</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;The fADCK must below 18Mhz for your 12bit ADC.&lt;/P&gt;&lt;P&gt;I think you can use the ADIV in ADCx_CFG1 to divide down your fADCK.&lt;/P&gt;&lt;P&gt;6 ADCK clock cycles is the subsequent sample time of your 12bit ADC, the total conversion time for all configurations is summarized in the equation below.(For more information you can refer the "37.4.5.5 Sample time and total conversion time" of K60P144M150SF3RM)&lt;/P&gt;&lt;P&gt;ConversionTime=SFCAdder+AverageNum*(BCT+LSTAdder+HSCAdder)&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 22 Jul 2014 10:24:02 GMT</pubDate>
    <dc:creator>Robin_Shen</dc:creator>
    <dc:date>2014-07-22T10:24:02Z</dc:date>
    <item>
      <title>ADC operating above max speed?</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322297#M14561</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Using a timer, I measured my sample rate of my ADC at ~3Msps.&lt;/P&gt;&lt;P&gt;I am using a k60f120 board, which according to k60P144M120SF3, has a max ADC sampling rate of only ~800ksps.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Is it plausible that my ADC is reading that much faster than the rated speed, or am I doing something wrong?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I set my ADC to sample continuously and trigger DMA with the DMAEN flag.&amp;nbsp; I am sampling with 12 bit resolution.&amp;nbsp; The DMA just reads the ADC1_RA and writes to a buffer.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To time, I am using the MQX _time_get_ticks and _time_diff_microseconds by triggering a DMA major loop interrupt after 256 samples.&amp;nbsp; I measure 85 microseconds for 256 samples ~= 3Msps.&amp;nbsp; I am running in debug mode, not release mode, but I am not setting breakpoints.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 18 Jul 2014 17:57:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322297#M14561</guid>
      <dc:creator>trichert</dc:creator>
      <dc:date>2014-07-18T17:57:00Z</dc:date>
    </item>
    <item>
      <title>Re: ADC operating above max speed?</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322298#M14562</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;My code:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #define MEMORY_BUFFER_SIZE 256&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #define MEM_BUF_T uint16_t&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MQX_TICK_STRUCT tick_last;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int counter = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t timer[20];&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_ch0_isr(void *ptr){&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool overflow;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MQX_TICK_STRUCT tick_temp;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMA_CINT = DMA_CINT_CINT(0);//clear interrupt flag&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(counter &amp;lt; 20){//should use semophore&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _time_get_ticks(&amp;amp;time_temp);&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timer[counter++] = _time_diff_microseconds(&amp;amp;tick_temp);&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tick_last = tick_temp;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;void MAIN_task(uint32_t initial_data){&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;MEM_BUF_T dma_dst[MEMORY_BUFFER_SIZE] = {0};&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;unsigned int index;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;_time_get_ticks(&amp;amp;tick_last);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;//enable clocks&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;SIM_SCGC6 |= SIM_SCGC6_DMAMUX0_MASK;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;SIM_SCGC3 |= SIM_SCGC3_ADC1_MASK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;_int_install_isr(16, dma_ch0_isr, NULL);&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;_bsp_int_init(16, 3, 0, TRUE);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;ADC_SC2 = ADC_SC2_DMAEN_MASK;//DMA interrupt&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;ADC1_SC3 = ADC1_SC3_ADC0_MASK;//continuous&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;ADC1_CFG1 = ADC_CFG1_MODE(1);//12 bit&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMAMUX0_CHCFG0 = 0;//disable hardware DMA request while config&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMAMUX1_CHCFG0 = 0;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_SADDR = &amp;amp;ADC1_RA;//read from ADC&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_SOFF = 0;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_SLAST = 0;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_DADDR = &amp;amp;dma_dst[0];//write to buffer&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_DOFF = sizeof(MEM_BUF_T);//destination increment&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_DLASTSGA = -sizeof(MEM_BUF_T) * MEMORY_BUFFER_SIZE;//reset addr&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_NBYTES_MLNO = sizeof(MEM_BUF_T);//minor loop 2 bytes&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_BITER_ELINKNO = MEMORY_BUFFER_SIZE;//256 iterations&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_CITER_ELINKNO = MEMORY_BUFFER_SIZE;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_ATTR = DMA_ATTR_SSIZE(1) | DMA_ATTR_DSIZE(1);//2 bytes transfer size&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_TCD0_CSR = DMA_CSR_INTMAJOR_MASK;//interrupt after major loop&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMA_ERQ |= DMA_ERQ_ERQ0_MASK;//allow ADC to trigger DMA&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;//ADC1 triggers DMA&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;DMAMUX0_CHCFG0 = DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(41);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;ADC1_SC1A = ADC_SC1_ADCH(20);//start reading ADC1 potentiometer&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;while(counter &amp;lt; 20){}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;for(index = 1; index &amp;lt; 20; index++){printf(%4d: %6d\n\r", index, timer[index]);}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="padding-left: 30px;"&gt;_mqx_exit(0);&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 18 Jul 2014 18:13:12 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322298#M14562</guid>
      <dc:creator>trichert</dc:creator>
      <dc:date>2014-07-18T18:13:12Z</dc:date>
    </item>
    <item>
      <title>Re: ADC operating above max speed?</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322299#M14563</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Richert&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I think the ADC conversion rate in k60P144M120SF3 is right, for 12-bit ADC the max conversion time is about 800ksps.&lt;/P&gt;&lt;P&gt;This can be calculated by using the equation in "37.4.5.5 Sample time and total conversion time" of K60P144M150SF3RM.&lt;/P&gt;&lt;P&gt;Also you can use &lt;A href="http://cache.freescale.com/files/soft_dev_tools/software/app_software/converters/ADC_CALCULATOR_CNV.zip"&gt;ADC calculator tool&lt;/A&gt; to evaluate the ADC conversion rate of different configuration.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Each time the ADC sampling, you can observed voltage disturbances (voltage drops/peaks) at the ADC input.&amp;nbsp; &lt;A href="http://cache.freescale.com/files/microcontrollers/doc/app_note/AN4373.pdf?fasp=1"&gt;AN4373(Cookbook for SAR ADC Measurements)&lt;/A&gt;&lt;/P&gt;&lt;P&gt;You can get the waveforms obtained by oscilloscope like below:&lt;/P&gt;&lt;P&gt;By measure the time between each sampling , you can get the real conversion rate.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="ADC conversion time.bmp"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/45130i395600320F771850/image-size/large?v=v2&amp;amp;px=999" role="button" title="ADC conversion time.bmp" alt="ADC conversion time.bmp" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 21 Jul 2014 08:48:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322299#M14563</guid>
      <dc:creator>Robin_Shen</dc:creator>
      <dc:date>2014-07-21T08:48:18Z</dc:date>
    </item>
    <item>
      <title>Re: ADC operating above max speed?</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322300#M14564</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for pointing me to the sample time subsection.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I now suspect that I am operating at too high of a clock frequency.&amp;nbsp; The default bus clock frequency is the system clock (50Mhz.).&amp;nbsp; The max allowable clock frequency is 18Mhz.&amp;nbsp; I think I have the ADC configured to take 6 ADCK clock cycles.&amp;nbsp; The DMA requires 11 to read, I think.&amp;nbsp; 50/17 ~= 3Mhz.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I guess if the clock is too fast, the ADC still works, but loses precision?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 21 Jul 2014 13:15:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322300#M14564</guid>
      <dc:creator>trichert</dc:creator>
      <dc:date>2014-07-21T13:15:00Z</dc:date>
    </item>
    <item>
      <title>Re: ADC operating above max speed?</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322301#M14565</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;The fADCK must below 18Mhz for your 12bit ADC.&lt;/P&gt;&lt;P&gt;I think you can use the ADIV in ADCx_CFG1 to divide down your fADCK.&lt;/P&gt;&lt;P&gt;6 ADCK clock cycles is the subsequent sample time of your 12bit ADC, the total conversion time for all configurations is summarized in the equation below.(For more information you can refer the "37.4.5.5 Sample time and total conversion time" of K60P144M150SF3RM)&lt;/P&gt;&lt;P&gt;ConversionTime=SFCAdder+AverageNum*(BCT+LSTAdder+HSCAdder)&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 22 Jul 2014 10:24:02 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/ADC-operating-above-max-speed/m-p/322301#M14565</guid>
      <dc:creator>Robin_Shen</dc:creator>
      <dc:date>2014-07-22T10:24:02Z</dc:date>
    </item>
  </channel>
</rss>

