Mcuzone_TKN 发表于 2020-5-13 15:19:22

SAM4E-EK开发板代码解读06——AFEC

本帖最后由 Mcuzone_TKN 于 2020-5-15 15:25 编辑

关键词:Microchip AtmelSAM4E SAM4E-EKSAM4E16E 芯片AFEC(ADC) 数模转换


概述:简要设置AFEC测试模式


很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值)。这个时候就可以用到模数转换器(ADC)了。SAM4E芯片中,ADC是由AFEC管理的。同时,AFEC可以使用一个多路复用器以选择需要转换的信号的通道,也可以通过平均多次ADC转换的结果以提高转换精确度。



打开产品光盘SAM4E16E-EK/SAM4E16E-EK中文资料/softpack软件包/Atmel Studio 7,打开06_AFEC_Feature_EXAMPLE例子。


int main(void)
{
uint8_t uc_key;

sysclk_init();
board_init();
configure_console();

puts(STRING_HEADER);
g_afec0_sample_data = 0;
g_afec1_sample_data = 0;
g_max_digital = MAX_DIGITAL_12_BIT;
//简要设置AFEC测试模式
set_afec_test();
while (1) {
afec_start_software_conversion(AFEC0);
delay_ms(g_delay_cnt);
//检查用户是否输入了密钥
if (!uart_read(CONF_UART, &uc_key)) {
//禁用所有afec中断
afec_disable_interrupt(AFEC0, AFEC_INTERRUPT_ALL);
   afec_disable_interrupt(AFEC1, AFEC_INTERRUPT_ALL);
   tc_stop(TC0, 0);
   set_afec_test();
}
}
}

static void set_afec_test(void)
{
uint8_t uc_key;
struct afec_config afec_cfg;
struct afec_ch_config afec_ch_cfg;
display_menu();
afec_enable(AFEC0);
afec_get_config_defaults(&afec_cfg);
afec_ch_get_config_defaults(&afec_ch_cfg);
while (uart_read(CONF_UART, &uc_key));
switch (uc_key) {
case '0':
//此测试将使用AFEC0 channel9连接部输入
设置增益 = 1,如果外部输入电压为100mv
输出结果应该是1650+100*1 = 2050mv.
puts("Gain Test(AFEC0_AD9) \n\r");
g_delay_cnt = 1000;
afec_init(AFEC0, &afec_cfg);
afec_ch_cfg.gain = AFEC_GAINVALUE_0;
afec_ch_set_config(AFEC0, AFEC_CHANNEL_9, &afec_ch_cfg);
afec_set_trigger(AFEC0, AFEC_TRIG_SW);
afec_channel_enable(AFEC0, AFEC_CHANNEL_9);
afec_set_callback(AFEC0, AFEC_INTERRUPT_DATA_READY, afec0_data_ready, 1);
afec_start_calibration(AFEC0);
while((afec_get_interrupt_status(AFEC0) & AFEC_ISR_EOCAL) != AFEC_ISR_EOCAL);
break;
case '1':
//此测试将使用AFEC0 channel10和channel 11作为阳性和输入为负,
因此输出结果为外部输入电压相减电位器的电压。
差分电压范围为-1.65v~+1.65v


puts("Differential Input Test(AFEC0_AD10 AD11) \n\r");
g_delay_cnt = 1000;
afec_init(AFEC0, &afec_cfg);
afec_ch_cfg.diff = true;
afec_ch_set_config(AFEC0, AFEC_CHANNEL_10, &afec_ch_cfg);
afec_ch_set_config(AFEC0, AFEC_CHANNEL_11, &afec_ch_cfg);
afec_set_trigger(AFEC0, AFEC_TRIG_SW);
afec_channel_enable(AFEC0, AFEC_CHANNEL_10);
afec_channel_enable(AFEC0, AFEC_CHANNEL_11);
afec_set_callback(AFEC0, AFEC_INTERRUPT_DATA_READY, afec0_diff_data_ready, 1);
afec_start_calibration(AFEC0);
while((afec_get_interrupt_status(AFEC0) & AFEC_ISR_EOCAL) != AFEC_ISR_EOCAL);
break;
case '2':
//本测试使用AFEC0 channel9连接外部输入。集成了增强分辨率测试和增益和偏移测试。
puts("Typical Application Test(AFEC0_AD9) \n\r");
g_delay_cnt = 1000;
g_max_digital = MAX_DIGITAL_12_BIT * 16;
afec_cfg.resolution = AFEC_16_BITS;
afec_init(AFEC0, &afec_cfg);
afec_ch_cfg.gain = AFEC_GAINVALUE_0;
afec_ch_set_config(AFEC0, AFEC_CHANNEL_9, &afec_ch_cfg);
afec_set_trigger(AFEC0, AFEC_TRIG_SW);
afec_channel_enable(AFEC0, AFEC_CHANNEL_9);
afec_set_callback(AFEC0, AFEC_INTERRUPT_DATA_READY, afec0_data_ready, 1);
afec_start_calibration(AFEC0);
while((afec_get_interrupt_status(AFEC0) & AFEC_ISR_EOCAL) != AFEC_ISR_EOCAL);
break;
   
case '3':
//本测试使用AFEC0通道12连接外部输入。集成了增强分辨率测试和增益和偏移测试。
puts("Typical Application Test(AFEC0_AD12) \n\r");
g_delay_cnt = 1000;
g_max_digital = MAX_DIGITAL_12_BIT * 16;
afec_cfg.resolution = AFEC_16_BITS;
afec_init(AFEC0, &afec_cfg);
afec_ch_cfg.gain = AFEC_GAINVALUE_0;
afec_ch_set_config(AFEC0, AFEC_CHANNEL_12, &afec_ch_cfg);
afec_set_trigger(AFEC0, AFEC_TRIG_SW);
afec_channel_enable(AFEC0, AFEC_CHANNEL_12);
afec_set_callback(AFEC0, AFEC_INTERRUPT_DATA_READY, afec0_data_ready, 1);
afec_start_calibration(AFEC0);
while((afec_get_interrupt_status(AFEC0) & AFEC_ISR_EOCAL) != AFEC_ISR_EOCAL);
break;

case '4':
//本测试使用AFEC0 channel9连接外部输入。集成了增强分辨率测试和增益和偏移测试。
puts("Typical Application Test(AFEC0_AD13) \n\r");
g_delay_cnt = 1000;
g_max_digital = MAX_DIGITAL_12_BIT * 16;
afec_cfg.resolution = AFEC_16_BITS;
afec_init(AFEC0, &afec_cfg);
afec_ch_cfg.gain = AFEC_GAINVALUE_0;
afec_ch_set_config(AFEC0, AFEC_CHANNEL_13, &afec_ch_cfg);
afec_set_trigger(AFEC0, AFEC_TRIG_SW);
afec_channel_enable(AFEC0, AFEC_CHANNEL_13);
afec_set_callback(AFEC0, AFEC_INTERRUPT_DATA_READY, afec0_data_ready, 1);
afec_start_calibration(AFEC0);
while((afec_get_interrupt_status(AFEC0) & AFEC_ISR_EOCAL) != AFEC_ISR_EOCAL);
break;
default:
puts("Please select feature test correctly! \n\r");
break;

}
}



页: [1]
查看完整版本: SAM4E-EK开发板代码解读06——AFEC