1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban
本章将使用软件的方式控制APM32E103的DAC输出指定幅值、频率和个数的三角波。通过本章的学习,读者将学习到DAC的使用。
本章分为如下几个小节:
38.1 硬件设计
38.2 程序设计
38.3 下载验证
38.1 硬件设计
38.1.1 例程功能
/**
* @brief 设置DAC通道1输出三角波
* @param maxval : 最大值,范围:0~4095
* @param dt : 每个采样点输出后的延时,单位:微秒
* @param samples: 一个三角波周期采样点的个数,范围:0~(2 * maxval)
* @param n : 输出三角波的个数
* @retval 无
*/
void dac_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n)
{
uint16_t incval;
uint16_t curval;
uint16_t i;
uint16_t j;
samples += (samples % 2); /* 确保采样点的个数为偶数 */
incval = maxval / (samples / 2);
if (incval == 0)
{
return;
}
for (j = 0; j < n; j++)
{
curval = 0;
/* 每个周期从0开始输出 */
DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, curval);
for (i = 0; i < (samples / 2); i++) /* 输出三角波的上升沿 */
{
curval += incval;
DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, curval);
delay_us(dt);
}
for (i = 0; i < (samples / 2); i++) /* 输出三角波的下降沿 */
{
curval -= incval;
DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, curval);
delay_us(dt);
}
}
}
可以看到,该函数就是每间隔一段时间就修改一次DAC的输出电压,以控制DAC输出指定的三角波,对于该函数的实现,读者无需深究,仅需会使用该函数即可。
38.2.3 实验应用代码
本章实验的应用代码,如下所示:
int main(void)
{
uint8_t t = 0;
uint8_t key;
NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4); /* 设置中断优先级分组为组4 */
sys_apm32_clock_init(15); /* 配置系统时钟 */
delay_init(120); /* 初始化延时功能 */
usart_init(115200); /* 初始化串口 */
usmart_dev.init(120); /* 初始化USMART */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
dac_init(1); /* 初始化DAC1_OUT1通道 */
lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "DAC Triangular WAVE TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 110, 200, 16, 16, "KEY0:Wave1 KEY_UP:Wave2", RED);
/* 提示无输出 */
lcd_show_string(30, 130, 200, 16, 16, "DAC None", BLUE);
while (1)
{
t++;
key = key_scan(0); /* 按键扫描 */
if (key == KEY0_PRES) /* 高采样率,约1KHz波形 */
{
lcd_show_string(30, 130, 200, 16, 16, "DAC Wave1 ", BLUE);
/* 幅值4095,采样点间隔5us,200个采样点,100个波形 */
dac_triangular_wave(4095, 5, 2000, 100);
lcd_show_string(30, 130, 200, 16, 16, "DAC None ", BLUE);
}
else if (key == WKUP_PRES) /* 低采样率,约1KHz波形 */
{
lcd_show_string(30, 130, 200, 16, 16, "DAC Wave2 ", BLUE);
/* 幅值4095,采样点间隔500us,20个采样点,100个波形 */
dac_triangular_wave(4095, 500, 20, 100);
lcd_show_string(30, 130, 200, 16, 16, "DAC None ", BLUE);
}
if (t == 10) /* 定时时间到了 */
{
LED0_TOGGLE(); /* LED0闪烁 */
t = 0;
}
delay_ms(10);
}
}
应用代码中会初始化DAC通道1(PA4引脚),完成初始化后,便不断地扫描按键,并根据扫描到的按键,控制DAC通道1输出指定幅值、频率和个数三角波。
38.3 下载验证
在完成编译和烧录操作后,便可分别按下KEY0按键和KEY_UP按键控制DAC通道1输出不同类型的三角波,DAC通道1输出的三角波可通过示波器观察PA4引脚(DAC通道1输出引脚)看到。