打印
[Atmel]

跑一下SAM4N例程(十二):DAC输出

[复制链接]
888|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
好久也没跑例程了。原因是板子坏了,怎么好得请看:SAM4N XPLAINED pro出现 No device detect性ed. Error 4109的解决办法

今天跑的是ADC例程:

在Atmel Studio6.2环境下插上SAM4N板子,就直接有打开新例程,那一项。然后打开ADC的那个例程,截图如下:


其中ADC软出管脚定义如下:

#ifndef CONF_DACC_SINEWAVE_EXAMPLE_H_INCLUDED
#define CONF_DACC_SINEWAVE_EXAMPLE_H_INCLUDED

//! DAC channel used for test (PB13)
#define DACC_CHANNEL        0
//! DAC register base for test
#define DACC_BASE           DACC
//! DAC ID for test
#define DACC_ID             ID_DACC

#endif /* CONF_DACC_SINEWAVE_EXAMPLE_H_INCLUDED */



也就是说用的是DAC通道0即第PB13脚输出。


而该程可以允许用户输入频率的大小,及幅度的大小,当然在一定范围内。其值的改变是在时钟中断里实现的
void SysTick_Handler(void)
{
        uint32_t status;
        uint32_t dac_val;

        status = dacc_get_interrupt_status(DACC_BASE);

        /* If ready for new data */
        if ((status & DACC_ISR_TXRDY) == DACC_ISR_TXRDY) {
                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);
                dacc_write_conversion_data(DACC_BASE, dac_val);
        }
}


而主程序负责同用户交互:

while (1) {
                usart_serial_getchar((Usart *)CONSOLE_UART, &uc_key);

                switch (uc_key) {
                case '0':
                        printf("Frequency:\t");
                        ul_freq = get_input_value(MIN_FREQUENCY, MAX_FREQUENCY);
                        printf("\r\n");

                        if (ul_freq != VAL_INVALID) {
                                printf("Set frequency to : %luHz\n\r", (unsigned long)ul_freq);
                                SysTick_Config(sysclk_get_cpu_hz() / (ul_freq * SAMPLES));
                                g_ul_frequency = ul_freq;
                        }
                        break;

                case '1':
                        printf("Amplitude:\t");
                        ul_amp = get_input_value(MIN_AMPLITUDE, MAX_AMPLITUDE);
                        printf("\r\n");
                        if (ul_amp != VAL_INVALID) {
                                printf("Set amplitude to : %lu\n\r", (unsigned long)ul_amp);
                                g_l_amplitude = ul_amp;
                        }
                        break;

                case 'i':
                case 'I':
                        printf("-I- Frequency : %lu Hz Amplitude : %ld\n\r",
                                (unsigned long)g_ul_frequency, (long)g_l_amplitude);
                        break;

                case 'w':
                case 'W':
                        printf("-I- Switch wave to : %s\n\r", g_uc_wave_sel ?
                                "SINE" : "Full Amplitude SQUARE");
                        g_uc_wave_sel = (g_uc_wave_sel + 1) & 1;
                        break;

                case 'm':
                case 'M':
                        display_menu();
                        break;
                }
                puts("Press \'m\' or \'M\' to display the main menu again!\r");
        }




以下是运行的载图:有关输出示波器的照片明天再发,今天手机没有拿。




相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6955

帖子

67

粉丝