STM32-DAC输出三角波

实验要求:输出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);
    }
}

到这里,实验的代码便写完了。

你可能感兴趣的:(stm32,stm32,单片机,嵌入式硬件,c语言)