自学内容网 自学内容网

初学stm32 --- DAC输出三角波和正弦波

输出三角波实验简要:

1,功能描述

        通过DAC1通道1(PA4)输出三角波,然后通过DS100示波器查看波形

2,关闭通道1触发(即自动)

        TEN1位置0 

3,关闭输出缓冲

        BOFF1位置1

4,使用12位右对齐模式

       将数字量写入DAC_DHR12R1寄存器

输出三角波函数

/**
 * @brief       设置DAC_OUT1输出三角波
 *   @note      输出频率 ≈ 1000 / (dt * samples) Khz, 不过在dt较小的时候,比如小于5us时, 由于delay_us
 *              本身就不准了(调用函数,计算等都需要时间,延时很小的时候,这些时间会影响到延时), 频率会偏小.
 * 
 * @param       maxval : 最大值(0 < maxval < 4096), (maxval + 1)必须大于等于samples/2
 * @param       dt     : 每个采样点的延时时间(单位: us)
 * @param       samples: 采样点的个数, samples必须小于等于(maxval + 1) * 2 , 且maxval不能等于0
 * @param       n      : 输出波形个数,0~65535
 *
 * @retval      无
 */
void dac_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n)
{
    uint16_t i, j;
    float incval;                               /* 递增量 */
    float Curval;                               /* 当前值 */
    
    if(samples > ((maxval + 1) * 2))return ;    /* 数据不合法 */
        
    incval = (maxval + 1) / (samples / 2);      /* 计算递增量 */
    
    for(j = 0; j < n; j++)
    { 
        Curval = 0;
        HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);    /* 先输出0 */
        for(i = 0; i < (samples / 2); i++)      /* 输出上升沿 */
        {
            Curval  +=  incval;                 /* 新的输出值 */
            HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            delay_us(dt);
        }
        for(i = 0; i < (samples / 2); i++)      /* 输出下降沿 */
        {
            Curval  -=  incval;                 /* 新的输出值 */
            HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            delay_us(dt);
        }
    }
}

输出正弦波函数实验简要:

1,功能描述

        通过DAC1通道1(PA4)输出正弦波,然后通过DS100示波器查看波形

2,使用定时器7 TRGO事件触发转换

       TEN1位置1TSEL1[2:0]=010   

3,关闭输出缓冲

        BOFF1位置1

4,使用DMA模式

        DMAEN1位置1

5,使用12位右对齐模式

        将数字量写入DAC_DHR12R1寄存器

DAC输出正弦波实验配置步骤

1,初始化DMA

        HAL_DMA_Init()

2,将DMAADC句柄联系起来

        __HAL_LINKDMA()

3,初始化DAC

        HAL_DAC_Init()

4DAC MSP初始化

        HAL_DAC_MspInit()     配置NVICCLOCKGPIO

5,配置DAC相应通道相关参数

        HAL_DAC_ConfigChannel()

6,启动DAM传输

        HAL_DMA_Start()

7,配置定时器溢出频率并启动

        HAL_TIM_Base_Init() HAL_TIM_Base_Start()

8,配置定时器触发DAC转换

        HAL_TIMEx_MasterConfigSynchronization()

9,停止/启动DAC转换、DMA传输

        HAL_DAC_Stop_DMA() HAL_DAC_Start_DMA()

输出正弦波函数


uint16_t g_dac_sin_buf[4096];            /* 发送数据缓冲区 */

/**
 * @brief       产生正弦波序列函数
 *   @note      需保证: maxval > samples/2
 * @param       maxval : 最大值(0 < maxval < 2048)
 * @param       samples: 采样点的个数
 * @retval      无
 */
void dac_creat_sin_buf(uint16_t maxval, uint16_t samples)
{
    uint8_t i;
    float outdata = 0;                     /* 存放计算后的数字量 */
    float inc = (2 * 3.1415962) / samples; /* 计算相邻两个点的x轴间隔 */

    if(maxval <= (samples / 2))return ;   /* 数据不合法 */

    for (i = 0; i < samples; i++)
    {
        /* 
         * 正弦波函数解析式:y = Asin(ωx + φ)+ b
         * 计算每个点的y值,将峰值放大maxval倍,并将曲线向上偏移maxval到正数区域
         * 注意:DAC无法输出负电压,所以需要将曲线向上偏移一个峰值的量,让整个曲线都落在正数区域
         */
        outdata = maxval * sin(inc * i) + maxval;
        if (outdata > 4095)
            outdata = 4095; /* 上限限定 */
        //printf("%f\r\n",outdata);
        g_dac_sin_buf[i] = outdata;
    }
}

注意:在配置定时器触发DAC转换

        HAL_TIMEx_MasterConfigSynchronization();

关键结构体

/**
  * @brief  TIM Master configuration Structure definition
  */
typedef struct
{
  uint32_t  MasterOutputTrigger;   /*!< Trigger output (TRGO) selection
                                        This parameter can be a value of @ref TIM_Master_Mode_Selection */
  uint32_t  MasterSlaveMode;       /*!< Master/slave mode selection
                                        This parameter can be a value of @ref TIM_Master_Slave_Mode
                                        @note When the Master/slave mode is enabled, the effect of
                                        an event on the trigger input (TRGI) is delayed to allow a
                                        perfect synchronization between the current timer and its
                                        slaves (through TRGO). It is not mandatory in case of timer
                                        synchronization mode. */
} TIM_MasterConfigTypeDef;

其中MasterOutputTrigger为配置定时器触发输出的选择

/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection
  * @{
  */
#define TIM_TRGO_RESET            0x00000000U                                      /*!< TIMx_EGR.UG bit is used as trigger output (TRGO)              */
#define TIM_TRGO_ENABLE           TIM_CR2_MMS_0                                    /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO)             */
#define TIM_TRGO_UPDATE           TIM_CR2_MMS_1                                    /*!< Update event is used as trigger output (TRGO)                 */
#define TIM_TRGO_OC1              (TIM_CR2_MMS_1 | TIM_CR2_MMS_0)                  /*!< Capture or a compare match 1 is used as trigger output (TRGO) */
#define TIM_TRGO_OC1REF           TIM_CR2_MMS_2                                    /*!< OC1REF signal is used as trigger output (TRGO)                */
#define TIM_TRGO_OC2REF           (TIM_CR2_MMS_2 | TIM_CR2_MMS_0)                  /*!< OC2REF signal is used as trigger output(TRGO)                 */
#define TIM_TRGO_OC3REF           (TIM_CR2_MMS_2 | TIM_CR2_MMS_1)                  /*!< OC3REF signal is used as trigger output(TRGO)                 */
#define TIM_TRGO_OC4REF           (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0)  /*!< OC4REF signal is used as trigger output(TRGO)                 */
/**
  * @}
  */

配置的相关寄存器为:

MMS[2:0]我们选择010更新,事件被选为触发输入(TRGO)。

其中MasterSlaveMode为设置主从模式,这里我们选择无作用。

注意:使用DMA2来转移数据到DAC寄存器中


原文地址:https://blog.csdn.net/gdragen_/article/details/145094109

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!