k60之内部AD模块转换

转载 2012年03月28日 08:34:04

2.Kinetis的ADC内部结构框图,是我们接下来的编程的依据,老套路,上图:

可能第一眼我们的感觉都是。。。有点复杂哈,咳咳,所以我在图中对重要的部分用红线圈出来逐个分析了下,怎样,应该初步了然了吧,图中我圈出来的是重点抓住的,下面软件编程的时候需要用到,其他的可以随便看看,前提是你有足够的耐心去看一堆英文说明了,哈哈。

3.软件编程部分,其实无非就是操作寄存器,其实按照datasheet的来就可以,另外强调一下,官方例程给出的是PDB硬件触发,觉着有点麻烦,所以按照平时常用的方法(对我来说,还是习惯软件触发)针对Tower系统写了下,采用的是单端模式。如下:

 

/**********************************************************************************
**Routine:ADC_Init
**input:    ADC---ADC0 and ADC1 module selection
  bits:     0--8bit, 1--12bit, 2--10bit, 3--16bit
  channel:  0~23 in total of 24 channels in single-ended convertion mode
  mode:     INT_MODE, SEARCH_MODE(母语解释一下吧,哈哈,这里分为中断方式和查询方式)
**********************************************************************************/
void ADC_Init(ADC_MemMapPtr ADC, uint8 bits, uint8 channel, uint8 mode)
{
    if(ADC == ADC0_BASE_PTR)
      SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;              /* turn on the ADC0 clock */ 
    else if(ADC == ADC1_BASE_PTR)
      SIM_SCGC3 |= (SIM_SCGC3_ADC1_MASK );           /* turn on the ADC1 clock */
    
    ADC_CFG1_REG(ADC) |= ADC_CFG1_ADIV(3)            /* normal power, clock rate is (inputclock)/8 */
                         + ADC_CFG1_ADLSMP_MASK      /* long sample time */
                         + ADC_CFG1_MODE(bits)       /* bits range 0 to 3(0--8bit, 1--12bit, 2--10bit, 3--16bit) */
                         + ADC_CFG1_ADICLK(1);       /* inputclock is busclock/2 */
                                                                                                                                              
    ADC_CFG2_REG(ADC) &= ~(ADC_CFG2_MUXSEL_MASK      /* a registers is selected */
                         + ADC_CFG2_ADACKEN_MASK     /* Asynchronous clock output disabled */
                         + ADC_CFG2_ADHSC_MASK       /* Normal conversion sequence selected */
                         + ADC_CFG2_ADLSTS_MASK);    /* Default longest sample time. */               
/***********************************************************************************
**set default status:Software triger(a convertion is initated following a write to 
  SC1A)compare function disabled, DMA is disabled, default voltage reference pin
  (external pins VREFH and VREFL).
***********************************************************************************/
    ADC_SC2_REG(ADC) = 0;
    
    ADC_SC3_REG(ADC) |= ADC_SC3_ADCO_MASK            /* continuous conversions */
                        + ADC_SC3_AVGE_MASK          /* hardware averages enabled. */
                        + ADC_SC3_AVGS(3);           /* 4 samples average */
                 
  //---when in software triger mode,  a conversion is actived after the ADC_SC1A is writed.   
    ADC_SC1_REG(ADC,0)  = ADC_SC1_ADCH(channel);     /* single-ended AD20 channel is selected */
    
    if(mode == INT_MODE)
    {
      ADC_SC1_REG(ADC,0)  |= ADC_SC1_AIEN_MASK;      /* conversion complete interrrupt enabled */
      if(ADC == ADC0_BASE_PTR)
        enable_irq(adc0_isr_no);                     /* enable the ADC0 IRQ interrupt */
      else if(ADC == ADC1_BASE_PTR)
        enable_irq(adc1_isr_no);                     /* enable the ADC1 IRQ interrupt */
    }
    else if(mode == SEARCH_MODE)
      ADC_SC1_REG(ADC,0)  &= ~ADC_SC1_AIEN_MASK;     /* conversion complete interrrupt disabled */
}
/**********************************************************************************
**Routine:Read_ADC
**input:    ADC---ADC0 and ADC1 module selection
  result:   the pointer of the return value of the convertion result.
**********************************************************************************/
void Read_ADC(ADC_MemMapPtr ADC, uint16 * result)
{
    while(!(ADC_SC1_REG(ADC,0)&ADC_SC1_COCO_MASK));  /* wait until the selected numbers of convertion(determined by the AGVS bits) */
    *result = ADC_R_REG(ADC,0);                      /* clear the COCO flag by reading the corresponding data register. */
}
/**********************************************************************************
**Routine:adc0_isr
**Description: the interrupt service routine of ADC0
**********************************************************************************/  
void adc0_isr(void)
{
    (void) ADC0_RA;   
}
/**********************************************************************************
**Routine:adc1_isr
**Description: the interrupt service routine of ADC1
**********************************************************************************/
void adc1_isr(void)
{
    (void) ADC1_RA;
}
在这里解释下上面代码,其实看英文注释就行,我每步都做了简单的注释,按照步骤来即可。其实主要分两部分,一个就是其AD初始化部分,主要操作寄存器为ADC_SC1~ADC_SC3和ADC_CFG1~ADC_CFG2。输入参数包括ADC模块选择(包括两个,即ADC0和ADC1),转换精度选择(8位,10位,12位,16位),通道号(由于是单端模式,所以范围为0~23共24个通道)和输出模式(查询或者中断模式);另外就是读结果寄存器部分,包括了查询方式读和中断方式读(我使用了查询方式,所以中断方式我设置了空读,呵呵,其实根本没用到),完整文件见附件。
4.再补充一部分,即主函数内部的调用方法,由于本例程是根据Tower系统写的,而系统板上电位器的分压端是连在ADC1_DM1端上的,不过对单端模式来说其实是连在了AD20这个通道上的,如下图通道安排(看到Chapter3了吧,呵呵,find it in chapter3, you can get it,哈哈):
下面是具体在main函数里的调用方法,如下:
void main(void)
{
  //---------------insert your code in the following--------------
  uint16 AD_Result;       /* 声明AD转换结果变量,存储AD值 */
  
  ADC_Init(ADC1, 3, 20, SEARCH_MODE);   /* 初始化AD1位单通道20输入,转换结果16bit, 查询模式 */
  EnableInterrupts;
  
  while(1)
  {
    Read_ADC(ADC1, &AD_Result);         /* 查询方式读取AD转换结果 */
  }
}

《一天攻破K60》笔记(使用山外库5.3版本)

K60引脚功能表注意:本功能表只是阐述各个引脚支持的功能,具体引脚名称标注和排列方式以相应最小系统板为准 IAR工程的建立建立工作空间File->New->WorkSpace建立工程Project-...
  • lczdk
  • lczdk
  • 2016年12月27日 01:11
  • 5843

ADC模块基本设置与扩展

犹豫了好久,今天终于有勇气写自己的技术博客了,其实之前有写过应用笔记,包括STM32的Cortex-M3内核系列的笔记以及自己做车这么久的学习笔记等。不管怎么说,今天都是一个新的开始新的尝试,话不多说...
  • u011958367
  • u011958367
  • 2014年01月25日 11:43
  • 1773

K60学习笔记一:PORT端口

预备C语言知识: 一. 1.#ifndef //#idndef用来判断后面的标识符是否为未定义的。 #elseif #endif在嵌入式的系统开发中,某个文件包含几个头文件,而且每个头文件都有可...
  • qq_24085431
  • qq_24085431
  • 2016年03月24日 22:24
  • 3201

k60之内部AD模块转换

2.Kinetis的ADC内部结构框图,是我们接下来的编程的依据,老套路,上图: 可能第一眼我们的感觉都是。。。有点复杂哈,咳咳,所以我在图中对重要的部分用红线圈出来逐个分析了下,怎样,...
  • gkl199011
  • gkl199011
  • 2014年07月03日 14:14
  • 539

K60内部ADC模块的转换时间的计算

AD采样转换时间的测试,转换时间计算公式如下: conversionTime=SFCAdder+AverageNum*(BCT+LSTAdder+HSCAdder); 方案一,最短...
  • wu159632
  • wu159632
  • 2012年03月22日 17:48
  • 5127

stc12c5a60s2-内部AD

  • 2015年07月02日 10:42
  • 3KB
  • 下载

STC12C5a60s2d内部的AD,串口发送

  • 2013年08月15日 11:31
  • 3KB
  • 下载

stc12c5a60s2 内部AD程序

  • 2012年05月27日 15:34
  • 3KB
  • 下载

简单验证K60内部时钟运行频率 .

新的一年,开个好头~K60凉在手里好多天了,好久没弄了,今天又拿出来当宝贝似的玩了玩,捣鼓了一上午,有点小收获,跟大家分享一下,因为只是一种小技巧,所以就不单独列入从零入手系列了。     其实...
  • wk119911
  • wk119911
  • 2013年01月03日 16:50
  • 701

k60内部代码

  • 2013年05月05日 18:08
  • 607KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:k60之内部AD模块转换
举报原因:
原因补充:

(最多只允许输入30个字)