zoukankan      html  css  js  c++  java
  • 智能车学习(五)—— dac学习

    一、代码共享:

    1、dac.h

    #ifndef DAC_H_
    #define DAC_H_
    
    #include "common.h"
    
    // 2.2 DAC控制寄存器0 位定义
    #define DAC_DISABLE   0x00                            //禁止DAC
    #define DAC_ENABLE    DAC_C0_DACEN_MASK               //使能DAC
    
    #define DAC_SEL_VREFO  0x00                           //参考电压1选择
    #define DAC_SEL_VDDA   DAC_C0_DACRFS_MASK             //参考电压2选择
    
    #define DAC_SEL_PDB_HW_TRIG  0x00                     //硬件触发
    #define DAC_SEL_SW_TRIG  DAC_C0_DACTRGSEL_MASK        //软件触发
    
    #define DAC_SW_TRIG_STOP 0x00                         //软触发无效
    #define DAC_SW_TRIG_NEXT  DAC_C0_DACSWTRG_MASK        //软触发有效
    
    #define DAC_HP_MODE  0x00                             //高功耗模式
    #define DAC_LP_MODE  DAC_C0_LPEN_MASK                 //低功耗模式
    
    //#define DAC_BFWM_INT_DISABLE  0x00                    //禁止缓冲溢出中断
    //#define DAC_BFWM_INT_ENABLE   DAC_C0_DACBWIEN_MASK    //使能缓冲溢出中断
    
    #define DAC_BFT_PTR_INT_DISABLE 0x00                  //禁止缓冲读取顶指针溢出
    #define DAC_BFT_PTR_INT_ENABLE DAC_C0_DACBTIEN_MASK   //使能缓冲读取顶指针溢出
    
    #define DAC_BFB_PTR_INT_DISABLE 0x00                  //禁止缓冲读取底指针溢出
    #define DAC_BFB_PTR_INT_ENABLE DAC_C0_DACBBIEN_MASK   //使能缓冲读取底指针溢出
    
    // 2.3 DAC控制寄存器1 位定义
    #define DAC_DMA_DISABLE  0x00                         //禁止DMA
    #define DAC_DMA_ENABLE DAC_C1_DMAEN_MASK              //使能DMA
    #define DAC_BF_NORMAL_MODE 0x00
    //#define
    #define DAC_BF_DISABLE      0x00
    
    //3 函数接口声明
    
    //============================================================================
    //函数名称:dac_init
    //函数返回:无
    //参数说明: VreReference:参考电压选择。0=1.75V,1=3V。
    //功能概要:初始化DAC模块设定。
    //============================================================================
    void dac_init(uint8_t VreReference);
    
    //============================================================================
    //函数名称:dac_convert
    //函数返回:DAC完成标志。0=完成失败,1=完成成功
    //参数说明:VReference: 参考电压转换值  范围(0~4095)
    //功能概要:执行DAC转换。
    //============================================================================
    uint8_t dac_convert(uint16_t VReference);
    
    
    //============================================================================
    //函数名称:dac_set_buffer
    //函数返回:设置的缓冲区大小值
    //参数说明:dacx_base_ptr:DACx基指针
    //          dacindex
    //          buffval      :缓冲区值
    //功能概要:设置DACx缓冲区
    //============================================================================
    int dac_set_buffer(DAC_MemMapPtr dacx_base_ptr, uint8_t dacindex, int buffval);
    
    
    //============================================================================
    //函数名称:dac_set
    //函数返回:无
    //参数说明:dacx_base_ptr:DACx基指针
    //                VrefSel:      参考电压
    //功能概要:DAC软件触发
    //============================================================================
    void dac_set(DAC_MemMapPtr dacx_base_ptr, uint8_t VrefSel);
    
    #endif

    2、dac.c

    #include "dac.h"               //包含DAC驱动程序头文件
    
    //============================================================================
    //函数名称:dac_init
    //函数返回:无
    //参数说明:RefVoltage:参考电压选择。0=1.2V,1=3.3V。
    //功能概要:初始化DAC模块设定。
    //============================================================================
    void dac_init(uint8_t RefVoltage)
    {
        uint8_t VreRF = DAC_SEL_VREFO;
        if(RefVoltage == 1)
        {
            VreRF =  DAC_SEL_VDDA;                 //3.3V
        }
    
        //SIM_SCGC2 |= SIM_SCGC2_DAC0_MASK ;      //使能DAC 0
          SIM_SCGC6 |=SIM_SCGC6_DAC0_MASK;        //使能DAC0时钟
          dac_set(DAC0_BASE_PTR,VreRF);
    }
    
    //============================================================================
    //函数名称:dac_convert
    //函数返回:DAC完成标志。0=完成失败,1=完成成功
    //参数说明:VReference: 参考电压转换值  范围(0~4095)
    //功能概要:执行DAC转换。
    //============================================================================
    uint8_t dac_convert(uint16_t VReference)
    {
    
        if(VReference != dac_set_buffer(DAC0_BASE_PTR, 0, VReference))
       {
          return 0;
       }
        else
            return 1;
    }
    
    
    //内部函数
    
    //============================================================================
    //函数名称:dac_set_buffer
    //函数返回:设置的缓冲区大小值
    //参数说明:dacx_base_ptr:DACx基指针
    //          dacindex    :缓冲区号
    //          buffval      :缓冲区值
    //功能概要:设置DACx缓冲区
    //============================================================================
    int dac_set_buffer( DAC_MemMapPtr dacx_base_ptr, uint8_t dacindex, int buffval)
    {
        int temp = 0;
        uint32_t datal = 0, datah = 0;
        //设置缓冲区低字节
        DAC_DATL_REG(dacx_base_ptr, dacindex)  =   (buffval&0x0ff);
        //设置缓冲区高字节
        DAC_DATH_REG(dacx_base_ptr, dacindex)  =   (buffval&0xf00) >>8;
        datal = DAC_DATL_REG(dacx_base_ptr, dacindex);
        datah = DAC_DATH_REG(dacx_base_ptr, dacindex)<<8;
        temp = (datal | datah);
        //temp =(DAC_DATL_REG(dacx_base_ptr, dacindex) | (DAC_DATH_REG(dacx_base_ptr, dacindex)<<8));
        return temp ;
    }
    
    
    
    //============================================================================
    //函数名称:dac_set
    //函数返回:无
    //参数说明:dacx_base_ptr:DACx基指针
    //                VrefSel:      参考电压
    //功能概要:配置DAC模块
    //============================================================================
    void dac_set(DAC_MemMapPtr dacx_base_ptr, uint8_t VrefSel)
    {
         //配置DAC_C0寄存器
         DAC_C0_REG(dacx_base_ptr)  = (
                                       DAC_BFB_PTR_INT_DISABLE|//缓冲区置底中断禁止
                                       DAC_BFT_PTR_INT_DISABLE|//缓冲区置顶中断禁止
                                       //DAC_BFWM_INT_DISABLE   |//水印中断禁止
                                       DAC_HP_MODE            |//高功耗模式
                                       DAC_SW_TRIG_STOP       |//软触发无效
                                       DAC_SEL_SW_TRIG        |//选择软件触发
                                       VrefSel                |//选择参考电压
                                       DAC_ENABLE              //使能DAC0模块
                                       );
    
         //配置DAC_C1寄存器
         DAC_C1_REG(dacx_base_ptr)= (
                                     DAC_BF_DISABLE           |//DAC缓冲区禁止
                                     DAC_BF_NORMAL_MODE       |//DAC选择区选择正常工作模式
                                     DAC_DMA_DISABLE           //DMA禁止
                                     ) ;
    }

    二、使用方法:

    uint16_t t = 0;
    dac_init(1);
        
    
    while(1)
    {
      dac_convert(t);
    }

    三、存在的问题:

         dac的转换管教是哪个,需要查一下手册

  • 相关阅读:
    interpolator-动画执行方式
    获得手机屏幕的宽度
    theme-windowAnimationStyle 动画四个方法的意义
    viewPager-基本实现示例
    ontouch、dispatchtouchevent、interceptouchevent-相关事件
    eclipse- log 打印跟输出到文件
    item-设置可见性
    touch、touchevent-事件总结
    005-磁盘读写原理
    004-双向链表
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4862310.html
Copyright © 2011-2022 走看看