查看: 2193|回复: 3

[其他] 每天解决一个问题32:K60 DAC(3)

[复制链接]
  • TA的每日心情
    开心
    2020-5-24 10:39
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    140

    主题

    2087

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3913
    最后登录
    2020-5-24
    发表于 2015-9-24 21:06:00 | 显示全部楼层 |阅读模式
    接上一篇帖子:https://www.nxpic.org.cn/modul ... =601438&pid=2152674
    DAC功能详解
    1.      DAC缓冲区操作
        缓冲区大小为1~16可设置大小的以word为单位的区域,转换的时候,由读指针指向正在转换的数据,可通过访问读指针获知当前正在转换的缓冲区单元。数据转换的次序为从顶部到底部依次转换,从顶部到底部之间,用户可设置位置标记(watermark)作为预警位置,当读指针指向缓冲区顶部、底部或位置标记处时,都有状态位可供查询,也可以发出中断请求。如果DAC使能,但DAC缓冲区未使能,则DAC的数据一直来自DAT0寄存器,该数据被转换成模拟电压输出。改变该寄存器中的数据,当前输出的模拟电压也会立刻改变。
       如果DAC和DAC缓冲区都使能,则缓冲区中被读指针指向的字数据会被转换成模拟电压,之后读指针会在硬件触发器或软件触发器的触发下,指向缓冲区中下一个字。
    数据缓冲区的工作模式有三个,模式的切换不会改变指针指向的位置。指针的值可以被置为0到DACBFUP之间的任何一个值。
    缓冲区普通模式为默认模式,在这个模式下,读指针在触发信号下每次加1,直到到达最高限,然后下一个触发信号到来时,指针回0。
    摇摆模式和普通模式不同的是,当读指针到达底部时,并不直接回0,而是开始递减,一步步退回缓冲区顶部。
    单次扫描模式是,读指针在触发信号下每次加1,直到到达最高限,然后停止。
       DAC数据缓冲区中的读指针指向位置可以触发3个中断。一个是,当读指针到达缓冲区底部时,也就是最高限时。第二个是,读指针到达缓冲区顶部时,也就是起始位置时。第三个是,读指针到达用户设置的位置标记时。
    2.      DAC触发信号
       当缓冲区使能时,DAC会在触发信号的驱动下轮流转换缓冲区中的数据。如没有触发信号,则当前DAC输出模拟电压的数据永远来自当前读指针指向的位置。如不使用缓冲区,则DAC转化无需设置触发器。
       触发信号有两个选择,一个是软件触发,一个是硬件触发,通过DACx_C0寄存器中的DACTRGSEL位设置。默认情况下,选择硬件触发,硬件触发信号来自PDB模块,软件触发通过程序指令实现。
       软件触发的方法是,只要向DACx_C0寄存器中的DACSWTRG位写1,即可实现软件触发。硬件触发则需要设置PDB模块,由PDB模块提供周期性的DAC间隔触发信号,详细可参见PDB模块设置。
    3.      例程
       将如下数组置于DAC缓冲区内,在触发信号触发下是实现连续转换,实现三角波输出。

    1.     uint16 DAC_DATA[]={255,511,767,1023,1279,1535,1791,2047,2303,  
    2.     2559,2815,3071,3327,3583,3839,4095};  
    uint16 DAC_DATA[]={255,511,767,1023,1279,1535,1791,2047,2303,2559,2815,3071,3327,3583,3839,4095};
    初始化代码如下:

    1.     void DAC0_Init(void)  
    2.     {  
    3.              uint8i;  
    4.              SIM_SCGC2|=SIM_SCGC2_DAC0_MASK;//打开DAC0时钟   
    5.              DAC0_C0|=DAC_C0_DACEN_MASK;//DAC使能   
    6.              DAC0_C0|=DAC_C0_DACRFS_MASK;//参考电压2,选择VDDA   
    7.              DAC0_C0&=~DAC_C0_DACTRGSEL_MASK;//使用硬件触发器   
    8.              DAC0_C1|=DAC_C1_DACBFEN_MASK;//缓冲区使能   
    9.              DAC0_C1|=DAC_C1_DACBFMD(1);//摇摆模式   
    10.           for(i=0;i<=15;i++)//缓冲区初始化   
    11.           {  
    12.                     DAC0_DATL(i)=DAC_DATA%256;  
    13.                     DAC0_DATH(i)=DAC_DATA/256;  
    14.           }  
    15.  }  
    我知道答案 目前已有3人回答
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    61

    主题

    965

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2394
    最后登录
    1970-1-1
    发表于 2015-9-25 08:51:07 | 显示全部楼层
    谢谢分享         
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-9-25 09:11:16 | 显示全部楼层
    学习了,谢谢分享
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5786
    最后登录
    2025-5-7
    发表于 2015-9-25 19:22:57 | 显示全部楼层
    谢谢介绍
    154120hhw0q0e0hpw374yw.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-13 03:14 , Processed in 0.089386 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表