TA的每日心情 | 开心 2016-3-22 09:25 |
---|
签到天数: 115 天 连续签到: 1 天 [LV.6]常住居民II
|
利用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
}
} |
|