• msp430学习笔记-DAC12


     MSP430F169 的DAC12 模块有2 个DAC 通道,并且可以用DAC12GRP控制位将多个DAC12通道组合起来,实现同步更新,硬件还能确保同步更新独立于任何中断或者NMI事件。

    DAC12模块特点:8位或12位分辨率可调、可编程时间对能量的损耗、可选内部或外部参考源、支持二进制原码和补码输入、具有自校验功能、可以多路DAC同步更新、还可用DMA等。

    这里实现的是较为简化的版本,需要可以自己添加或改写功能,如:初始化函数内部调用自校验的函数,可以在每一次初始化时候均自校验。

    DAC12每个模块只有两个寄存器:控制寄存和数据寄存器,控制寄存器用来初始化和设置模块的使用,数据寄存器用来存放要输出的电压数字量。169的DAC的寄存器如下: 
    DAC12_0控制寄存器    DAC12_0CTL 
    DAC12_0数据寄存器    DAC12_0DAT 
    DAC12_1控制寄存器    DAC12_1CTL 
    DAC12_1数据寄存器    DAC12_1DAT

    控制寄存器每一位的功能如下:

    DAC12REFx:选择DAC12的参考源 
      0,1 Vref+ 
      2,3 Veref+ 
    DAC12RES:选择DAC12分辨率 
      0 12位分辨率 
      1 8分辨率 
    DAC12LSELx:锁存器触发源选择 
    当 DAC12锁存器得到触发之后,能够将锁存器中的数据传送到DAC12的内核。 
    当 DAC12LSELx=0的时候,DAC数据更新不受DAC12ENC 的影响。 
      0 DAC12_XDAT执行写操作将触发(不考虑DAC12ENC 的状态) 
      1 DAC12_XDAT执行写操作将触发(考虑DAC12ENC 的状态) 
      2 Timer_A3.OUT1的上升沿 
      3 Timer_B7.OUT2的上升沿 
    DAC12CALON:DAC12校验操作控制 
    置位后启动校验操作,校验完成后自动被复位。校验操作可以校正偏移误差。 
      0 没有启动校验操作 
      1 启动校验操作 
    DAC12IR:DAC12输入范围 
    设定输入参考电压和输出的关系 
      0 DAC12的满量程为参考电压的3倍(不操作AVcc) 
      1 DAC12的满量程为参考电压 
    DAC12AMPx:DAC12运算放大器设置 
      0 输入缓冲器关闭,输出缓冲器关闭,高阻 
      1 输入缓冲器关闭,输出缓冲器关闭,0V 
      2 输入缓冲器低速低电流,输出缓冲器低速低电流 
      3 输入缓冲器低速低电流,输出缓冲器中速中电流 
      4 输入缓冲器低速低电流,输出缓冲器高速高电流 
      5 输入缓冲器中速中电流,输出缓冲器中速中电流 
      6 输入缓冲器中速中电流,输出缓冲器高速高电流 
      7 输入缓冲器高速高电流,输出缓冲器高速高电流 
    DAC12DF:DAC12的数据格式 
      0 二进制 
      1 二进制补码 
    DAC12IE:DAC12的中断允许 
      0 禁止中断 
      1 允许中断 
    DAC12IFG:DAC12的中断标志位 
      0 没有中断请求 
      1 有中断请求 
    DAC12ENC:DAC12转换控制位 
    DAC12LSEL>0的时候,DAC12ENC 才有效。 
      0 DAC12停止 
      1 DAC12转换 
    DAC12GRP:DAC12组合控制位 
      0 没有组合 
      1 组合

    校准函数,完成DAC12模块的自校准,也是通过参数传递要校准的模块;电压输出函数

    /********************************************************
    * 函数名称:DAC12Init
    * 功 能:DAC12用到的相关资源初始化
    * 参 数:
    * module模块 0:使用模块DAC12_0
    * 1:使用模块DAC12_1
    * 2:使用模块DAC12_0/1
    * 3:使用模块DAC12_0/1 共同更新
    * DAC12AMPx:DAC运算放大器设置:
    * 0 输入缓冲器关闭,输出缓冲器关闭,高阻
    * 1 输入缓冲器关闭,输出缓冲器关闭,0V
    * 2 输入缓冲器低速/电流,输出缓冲器低速/电流
    * 3 输入缓冲器低速/电流,输出缓冲器中速/电流
    * 4 输入缓冲器低速/电流,输出缓冲器高速/电流
    * 5 输入缓冲器中速/电流,输出缓冲器中速/电流
    * 6 输入缓冲器中速/电流,输出缓冲器高速/电流
    * 7 输入缓冲器高速/电流,输出缓冲器高速/电流
    * 返 回 值:char,设置成功返回1,参数错误返回0
    * 说 明:其他默认为:12位方案、写入即更新输出,module模
    * 块为3时,两个都写入更新;DAC12的满量程为参考电
    * 压;内部2.5v参考电压:需要AD设置参考源打开2.5.
    *********************************************************/
    char DAC12Init(char module,char DAC12AMPx)
    {
      if(DAC12AMPx>7)
      {
        return(0);
      }
    //---------------------------设置模块-------------------------------
      switch(module)
      {
        case 0:case'0': DAC12_0Init(DAC12AMPx); break; //模块0
        case 1:case'1': DAC12_1Init(DAC12AMPx); break; //模块1
        case 2:case'2':
        DAC12_0Init(DAC12AMPx);
        DAC12_1Init(DAC12AMPx);
        break; //模块0、1
        case 3:case'3':
        DAC12_0Init(DAC12AMPx);
        DAC12_1Init(DAC12AMPx);
        DAC12_0CTL |= DAC12GRP;
        break; //无校验
        default : return(0); //参数错误
      }
      return (1);
    }
    这里参数无效返回0,设置完成返回1,不过要注意的是在使用DAC之前,必须开启内部参考源(在ADC模块里面,具体可以参考使用示例)。

    DAC12_0Init和DAC12_1Init函数内容一样,只不过控制寄存器分别是DAC12_0CTL和DAC12_0CTL,这里只给出DAC12_0Init的函数,另一个参考源程序:

    void DAC12_0Init(char DAC12AMPx)
    {
      // Internal ref gain 1
      DAC12_0CTL = DAC12SREF_0 + DAC12IR;
      DAC12_0CTL |= DAC12LSEL_1 + (DAC12AMPx << 5);
      DAC12_0CTL |= DAC12ENC;
    }
    这个函数仅仅完成控制寄存器的设置。选内部参考源,输出满量程是参考电压的1倍,更新方式:写入即更新,如果group设置,则两个都写入才更新。

    校准函数:完成DAC12模块自校准,

    void DAC12Cal(char module)
    {
      switch(module)
      {
        case 0:case'0':
        DAC12_0CTL |= DAC12CALON; // 启动效验DAC
        while((DAC12_0CTL & DAC12CALON) != 0); // 等待效验完成
        break; //模块0
        case 1:case'1':
        DAC12_1CTL |= DAC12CALON; // 启动效验DAC
        while((DAC12_1CTL & DAC12CALON) != 0); // 等待效验完成
        break; //模块1
        case 2:case'2':
        case 3:case'3':
        DAC12_0CTL |= DAC12CALON; // 启动效验DAC
        while((DAC12_0CTL & DAC12CALON) != 0); // 等待效验完成
        DAC12_1CTL |= DAC12CALON; // 启动效验DAC
        while((DAC12_1CTL & DAC12CALON) != 0); // 等待效验完成
        break; //模块0、1
        default : return; //参数错误
      }
    }
    参数含义和前初始化的函数相同,为了使用函数时一致。

    输出函数:

    void DAC12Out(char module,int out)
    {
      switch(module)
      {
        case 0:case'0': DAC12_0DAT=out; break; //模块0
        case 1:case'1': DAC12_1DAT=out; break; //模块1
        case 2:case'2':
        case 3:case'3': DAC12_0DAT=out; DAC12_1DAT=out; break; //模块0、1
        default : return; //参数错误
      }
    }
    输出函数的参数也和初始化的module参数含义相同,这个函数比较简单,只是按照要输出的值赋给DAT寄存器。

    DAC12的程序库就这么多,DAC12还可以严格按时间更新数据,以输出一定频率的波形,可以设置为TA out1上升沿更新数据,或TB out2上升沿更新。另外还可以和DMA共同使用,完成更复杂的功能;这里均没有实现,需要的话可以根据寄存器功能来实现。


    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
      ClkInit();
      DAC12Init(3,5); //初始化
      DAC12Cal(2); //校准
      ADC12CTL0 = REF2_5V + REFON; //开启内部参考源 2.5v 必须有;以供DA使用
      DAC12Out(2,0x666);
    }
    ADC12CTL0 = REF2_5V + REFON;这句即是开启参考电压2.5v以供DA使用。

     引用:http://www.cnblogs.com/Engin/archive/2011/08/22/2149448.html

  • 相关阅读:
    Prometheus监控k8s集合
    docker集合
    开源堡垒机jumpserver
    ELK日志分析平台
    安全名称解释
    CPU上下文切换
    平均负载
    234. 回文链表
    125. 验证回文串
    122. 买卖股票的最佳时机II
  • 原文地址:https://www.cnblogs.com/xubeiping0930/p/4522664.html
Copyright © 2020-2023  润新知