返回列表 发新帖

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

[复制链接]

28

主题

45

帖子

1万

积分

允许发帖

积分
10186
发表于 2020-5-13 15:19:22 | 显示全部楼层 | 阅读模式
本帖最后由 Mcuzone_TKN 于 2020-5-15 15:25 编辑

关键词:Microchip Atmel  SAM4E SAM4E-EK  SAM4E16E 芯片  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;
  
}
}




回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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