本帖最后由 Mcuzone_TKN 于 2020-5-15 09:13 编辑
关键词:Microchip Atmel SAM4E SAM4E-EK SAM4E16E 芯片 DAC 数模转换器
概述:演示如何在自由运行模式下使用DAC
该例子允许配置输出“正弦波”的频率和振幅,频率可设置成200HZ~3KHZ,峰值振幅可设置为100~1023/4095,分辨率为18/12位。
打开产品光盘SAM4E16E-EK/SAM4E16E-EK中文资料/softpack软件包/Atmel Studio 7,打开05_DACC_EXAMPLE例子。
int main(void)
{
static uint8_t i;
uint8_t uc_key;
uint32_t ul_freq, ul_amp;
sysclk_init();
board_init();
configure_console();
puts(STRING_HEADER);
//使能DAC的时钟
#if SAM4L
sysclk_enable_peripheral_clock(DACC_BASE);
#else
sysclk_enable_peripheral_clock(DACC_ID);
#endif
//重置DAC寄存器
dacc_reset(DACC_BASE);
//半字节传输模式
dacc_set_transfer_mode(DACC_BASE, 0);
//初始化定时、振幅和频率
#if (SAM3N) || (SAM4L) || (SAM4N)
//使能0x10(17个时钟) 内部触发时钟 0x60 (96个时钟)
dacc_set_timing(DACC_BASE, 0x10, 0x60);
//使能DAC
dacc_enable(DACC_BASE);
#else
//省电 睡眠模式 0 禁用;快速唤醒 0禁用。
dacc_set_power_save(DACC_BASE, 0, 0);
//时间 刷新 0x08 (1024*8 dacc时钟) 最高速度模式- 0(禁用) 启动时间- 0x10 (1024 dacc时钟)
dacc_set_timing(DACC_BASE, 0x08, 0, 0x10);
//禁用标签并选择输出通道DACC_CHANNEL
dacc_set_channel_selection(DACC_BASE, DACC_CHANNEL);
//使能输出通道DAC通道
dacc_enable_channel(DACC_BASE, DACC_CHANNEL);
//设置模拟电流
dacc_set_analog_control(DACC_BASE, DACC_ANALOG_CONTROL);
#endif
while (1) {
for (i=0; i<20; i++)
{
dacc_write_conversion_data(DACC_BASE, 3686);
delay_us(384);
dacc_write_conversion_data(DACC_BASE, 410);
delay_us(384);
}
delay_s(1);
for (i=0; i<20; i++)
{
dacc_write_conversion_data(DACC_BASE, 3686);
delay_us(342);
dacc_write_conversion_data(DACC_BASE, 410);
delay_us(342);
}
delay_s(1);
for (i=0; i<20; i++)
{
dacc_write_conversion_data(DACC_BASE, 3686);
delay_us(308);
dacc_write_conversion_data(DACC_BASE, 410);
delay_us(308);
}
delay_s(1);
for (i=0; i<20; i++)
{
dacc_write_conversion_data(DACC_BASE, 3686);
delay_us(289);
dacc_write_conversion_data(DACC_BASE, 410);
delay_us(289);
}
delay_s(1);
for (i=0; i<20; i++)
{
dacc_write_conversion_data(DACC_BASE, 3686);
delay_us(256);
dacc_write_conversion_data(DACC_BASE, 410);
delay_us(256);
}
delay_s(1);
for (i=0; i<20; i++)
{
dacc_write_conversion_data(DACC_BASE, 3686);
delay_us(231);
dacc_write_conversion_data(DACC_BASE, 410);
delay_us(231);
}
delay_s(1);
for (i=0; i<20; i++)
{
dacc_write_conversion_data(DACC_BASE, 3686);
delay_us(205);
dacc_write_conversion_data(DACC_BASE, 410);
delay_us(205);
}
delay_s(1);
for (i=0; i<20; i++)
{
dacc_write_conversion_data(DACC_BASE, 3686);
delay_us(192);
dacc_write_conversion_data(DACC_BASE, 410);
delay_us(192);
}
delay_s(2);
}
}
|