查看: 1043|回复: 0

SAM4L-EK 产生频率和幅度可调的方波

[复制链接]
  • TA的每日心情
    开心
    2016-3-22 09:25
  • 签到天数: 115 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2016-5-26 09:01:49 | 显示全部楼层 |阅读模式
    分享到:
    利用SAM4L-EK内部的DAC硬件,可以产生频率和幅度可调的方波、正弦波等常用波形;
    利用这些波形可以进行一些测试或者驱动外部的硬件如蜂鸣器等……
    设置频率为500的方波

    限于手头没有可用的示波器,因此用逻辑分析仪来测量DAC输出信号的频率,
    可以看到信号的周期为约2个毫秒,换算为频率为497Hz,
    注意DAC的输出在MCU的30PIN,也即PA06


    利用超级终端交互界面,再次设置频率为200

    同样可以用逻辑分析仪来测量,周期约5个毫秒
    换算为频率为199Hz,(见下图)

    DAC部分的初始化代码如下:
    /* Enable clock for DACC */
    #if SAM4L
    sysclk_enable_peripheral_clock(DACC_BASE);
    #else
    sysclk_enable_peripheral_clock(DACC_ID);
    #endif
    /* Reset DACC registers */
    dacc_reset(DACC_BASE);
    /* Half word transfer mode */
    dacc_set_transfer_mode(DACC_BASE, 0);
    /* Initialize timing, amplitude and frequency */
    #if (SAM3N) || (SAM4L) || (SAM4N)
    /* Timing:
    * startup                - 0x10 (17 clocks)
    * internal trigger clock - 0x60 (96 clocks)
    */
    dacc_set_timing(DACC_BASE, 0x10, 0x60);
    /* Enable DAC */
    dacc_enable(DACC_BASE);
    #else
    #if (SAM3S) || (SAM3XA)
    /* Power save:
    * sleep mode  - 0 (disabled)
    * fast wakeup - 0 (disabled)
    */
    dacc_set_power_save(DACC_BASE, 0, 0);
    #endif
    /* Timing:
    * refresh        - 0x08 (1024*8 dacc clocks)
    * max speed mode -    0 (disabled)
    * startup time   - 0x10 (1024 dacc clocks)
    */
    #if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
    #if (SAM4E)
    dacc_set_timing(DACC_BASE,0, 0x10);
    #else
    dacc_set_timing(DACC_BASE, 0x08, 0, 0x10);
    #endif
    /* Disable TAG and select output channel DACC_CHANNEL */
    dacc_set_channel_selection(DACC_BASE, DACC_CHANNEL);
    #endif
    /* Enable output channel DACC_CHANNEL */
    dacc_enable_channel(DACC_BASE, DACC_CHANNEL);
    同时在SystemTick_Handler中断函数中,
    将从串口接收到的设置值,写入内部DAC模块,
    这部分的代码如下
    void SysTick_Handler(void)
    {
    uint32_t status;
    uint32_t dac_val;
    status = dacc_get_interrupt_status(DACC_BASE);
    /* If ready for new data */
    #if (SAMV70 || SAMV71 || SAME70 || SAMS70)
    # if (DACC_CHANNEL == 0)
    if ((status & DACC_ISR_TXRDY0) == DACC_ISR_TXRDY0) {
    #elif (DACC_CHANNEL == 1)
    if ((status & DACC_ISR_TXRDY1) == DACC_ISR_TXRDY1) {
    #endif
    #else
    if ((status & DACC_ISR_TXRDY) == DACC_ISR_TXRDY) {
    #endif
    g_ul_index_sample++;
    if (g_ul_index_sample >= SAMPLES) {
    g_ul_index_sample = 0;
    }
    dac_val = g_uc_wave_sel ?
    ((g_ul_index_sample > SAMPLES / 2) ? 0 : MAX_AMPLITUDE)
    : wave_to_dacc(gc_us_sine_data[g_ul_index_sample],
    g_l_amplitude,
    MAX_DIGITAL * 2, MAX_AMPLITUDE);
    #if !(SAMV70 || SAMV71 || SAME70 || SAMS70)
    dacc_write_conversion_data(DACC_BASE, dac_val);
    #else
    dacc_write_conversion_data(DACC_BASE, dac_val, DACC_CHANNEL);
    #endif
    }
    }
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 08:37 , Processed in 0.111920 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.