实验要求:输出DAC1通道1(PA4)输出三角波。然后关闭通道1触发(TEN1位置0),关闭输出缓冲(BOFF1位置1),使用12位右对齐模式,将数字量写入DAC_DHR12R1寄存器。
接下来介绍产生三角波的函数。第一个参数为最大值的数字量,取值为0~4095,比如取值2048时候,输出最高值为1.65V;第二个参数为采样点的间隔时间,第三个参数为采样点的数量,而周期为采样点间隔时间 * 采样点的数量;第四个参数是总体产生的波形个数。采样点个数的约束如下:(采样点个数/2)<=(最大数字量 + 1)。
void dac_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n)
{
float incval;
float curval;
if(samples > ((maxval + 1) * 2)) return;
incval = (maxval + 1) / (samples / 2);
for(u16 j = 0; j < n; j++)
{
curval = 0;
HAL_DAC_SetValue(&DAC_HANDLE, channel, DAC_ALIGN_12B_R, curval);
for(u16 i = 0; i < (samples/2); i++) //上升波
{
curval += incval;
HAL_DAC_SetValue(&DAC_HANDLE, channel, DAC_ALIGN_12B_R, curval);
delay_us(dt);
}
for(u16 i = 0; i < (samples/2); i++) //下降波
{
curval -= incval;
HAL_DAC_SetValue(&DAC_HANDLE, channel, DAC_ALIGN_12B_R, curval);
delay_us(dt);
}
}
}
接下来编写主函数的实验代码main.c:
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./USMART/usmart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/DAC/dac.h"
#include "./BSP/ADC/adc3.h"
int main(void)
{
uint8_t t = 0;
uint8_t key;
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
usmart_dev.init(72); /* 初始化USMART */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
dac_init(1); /* 初始化DAC1_OUT1通道 */
lcd_show_string(30, 50, 200, 16, 16, "STM32", 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 KEY1: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);
dac_triangular_wave(4095, 5, 2000, 100); /* 幅值4095, 采样点间隔5us, 200个采样点, 100个波形 */
lcd_show_string(30, 130, 200, 16, 16, "DAC None ", BLUE);
}
else if (key == KEY1_PRES) /* 低采样率 , 约1Khz波形 */
{
lcd_show_string(30, 130, 200, 16, 16, "DAC Wave2 ", BLUE);
dac_triangular_wave(4095, 500, 20, 100); /* 幅值4095, 采样点间隔500us, 20个采样点, 100个波形 */
lcd_show_string(30, 130, 200, 16, 16, "DAC None ", BLUE);
}
if (t == 10) /* 定时时间到了 */
{
LED0_TOGGLE(); /* LED0闪烁 */
t = 0;
}
delay_ms(10);
}
}
到这里,实验的代码便写完了。