实例的目的是演示微控制器里边的自动比较功能
。要使用此功能,通道5连接到电位器应启用。用户可以改变
电压与阈值比较,终端将输出电流电压和配置的窗口值。
以下是程序:
- #include <stdio.h>
- #include <string.h>
- #include <assert.h>
- #include "asf.h"
- /** Reference voltage for AFEC in mv. */
- #define VOLT_REF (3300)
- /** The maximal digital value */
- #define MAX_DIGITAL (4095UL)
- #define STRING_EOL "\r"
- #define STRING_HEADER "-- AFEC Automatic Comparison Example --\r\n" \
- "-- "BOARD_NAME" --\r\n" \
- "-- Compiled: "__DATE__" "__TIME__" --"STRING_EOL
- /** Low threshold */
- static uint16_t gs_us_low_threshold = 0;
- /** High threshold */
- static uint16_t gs_us_high_threshold = 0;
- /**
- * \brief Configure UART console.
- */
- static void configure_console(void)
- {
- const usart_serial_options_t uart_serial_options = {
- .baudrate = CONF_UART_BAUDRATE,
- #ifdef CONF_UART_CHAR_LENGTH
- .charlength = CONF_UART_CHAR_LENGTH,
- #endif
- .paritytype = CONF_UART_PARITY,
- #ifdef CONF_UART_STOP_BITS
- .stopbits = CONF_UART_STOP_BITS,
- #endif
- };
- /* Configure console UART. */
- sysclk_enable_peripheral_clock(CONSOLE_UART_ID);
- stdio_serial_init(CONF_UART, &uart_serial_options);
- }
- /**
- * \brief Callback function for AFEC enter compasion window interrupt.
- */
- static void afec_print_comp_result(void)
- {
- uint16_t us_adc;
- /* Disable Compare Interrupt. */
- afec_disable_interrupt(AFEC0, AFEC_INTERRUPT_COMP_ERROR);
-
- us_adc = afec_channel_get_value(AFEC0, AFEC_CHANNEL_POTENTIOMETER);
- printf("-ISR-:Potentiometer voltage %d mv is in the comparison "
- "window:%d -%d mv!\n\r",
- (int)(us_adc * VOLT_REF / MAX_DIGITAL),
- (int)(gs_us_low_threshold * VOLT_REF / MAX_DIGITAL),
- (int)(gs_us_high_threshold * VOLT_REF / MAX_DIGITAL));
- }
- /**
- * \brief Application entry point.
- *
- * \return Unused (ANSI-C compatibility).
- */
- int main(void)
- {
- /* Initialize the SAM system. */
- sysclk_init();
- board_init();
- configure_console();
- /* Output example information. */
- puts(STRING_HEADER);
- gs_us_low_threshold = 0x0;
- gs_us_high_threshold = 0x7FF;
- afec_enable(AFEC0);
- struct afec_config afec_cfg;
- afec_get_config_defaults(&afec_cfg);
- afec_init(AFEC0, &afec_cfg);
- struct afec_ch_config afec_ch_cfg;
- afec_ch_get_config_defaults(&afec_ch_cfg);
-
- #if (SAMV71 || SAMV70 || SAME70 || SAMS70)
- /*
- * Because the internal AFEC offset is 0x200, it should cancel it and shift
- * down to 0.
- */
- afec_channel_set_analog_offset(AFEC0, AFEC_CHANNEL_POTENTIOMETER, 0x200);
- afec_ch_cfg.gain = AFEC_GAINVALUE_0;
- #else
- /*
- * Because the internal AFEC offset is 0x800, it should cancel it and shift
- * down to 0.
- */
- afec_channel_set_analog_offset(AFEC0, AFEC_CHANNEL_POTENTIOMETER, 0x800);
- #endif
- afec_ch_set_config(AFEC0, AFEC_CHANNEL_POTENTIOMETER, &afec_ch_cfg);
- afec_set_trigger(AFEC0, AFEC_TRIG_SW);
- afec_set_comparison_mode(AFEC0, AFEC_CMP_MODE_2, AFEC_CHANNEL_POTENTIOMETER, 0);
- afec_set_comparison_window(AFEC0, gs_us_low_threshold, gs_us_high_threshold);
- /* Enable channel for potentiometer. */
- afec_channel_enable(AFEC0, AFEC_CHANNEL_POTENTIOMETER);
- afec_set_callback(AFEC0, AFEC_INTERRUPT_COMP_ERROR, afec_print_comp_result, 1);
- while (1) {
- afec_start_software_conversion(AFEC0);
- delay_ms(1000);
- }
- }
可见该程序是经过配置后,就AFEC的通道及模式,最后还设了回调函数
最后运行结果如下:
|