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

ops/2025/1/16 23:09:50/

输出三角波实验简要:

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) selectionThis parameter can be a value of @ref TIM_Master_Mode_Selection */uint32_t  MasterSlaveMode;       /*!< Master/slave mode selectionThis parameter can be a value of @ref TIM_Master_Slave_Mode@note When the Master/slave mode is enabled, the effect ofan event on the trigger input (TRGI) is delayed to allow aperfect synchronization between the current timer and itsslaves (through TRGO). It is not mandatory in case of timersynchronization 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寄存器中


http://www.ppmy.cn/ops/150658.html

相关文章

【2024年华为OD机试】 (C卷,100分)- 停车场车辆统计(Java JS PythonC/C++)

一、问题描述 题目描述 特定大小的停车场&#xff0c;数组 cars[] 表示&#xff0c;其中 1 表示有车&#xff0c;0 表示没车。 车辆大小不一&#xff0c;小车占一个车位&#xff08;长度1&#xff09;&#xff0c;货车占两个车位&#xff08;长度2&#xff09;&#xff0c;卡…

微信小程序集成Vant Weapp移动端开发的框架

什么是Vant Weapp Vant 是一个轻量、可靠的移动端组件库&#xff0c;于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。 官网地睛&#xff1a;介绍 - Vant Weapp (vant-ui.gith…

JSON.stringify(res,null,2)的含义

JSON.stringify(res, null, 2) 是 JavaScript 中将对象转换为 JSON 字符串的方法&#xff0c;具体说明如下&#xff1a; 参数解释 res&#xff1a;要转换的对象。它可以是 JavaScript 中的任意类型&#xff0c;如对象、数组、字符串、数字等。例如&#xff0c;{name: "K…

使用vue3实现语音交互的前端页面

代码地址&#xff1a;https://github.com/ZZD3627/my-third-vue.git 需求 1.前端实现录音并将音频传到通过http请求将音频传递到后端 2.基于后端识别的语音及后端返回的内容进行语音沟通实现 1.使用MediaRecorder在前端使用录音功能 2.使用SpeechSynthesis实现将后端传来的文…

深度解析 React 中 setState 的原理:同步与异步的交织

在 React 框架的核心机制里&#xff0c;setState是实现动态交互与数据驱动视图更新的关键枢纽。深入理解setState的工作原理&#xff0c;尤其是其同步与异步的特性&#xff0c;对于编写高效、稳定且可预测的 React 应用至关重要。 一、setState 的基础认知 在 React 组件中&a…

Vue.js devtools插件点击Root失效或不显示数据甚至没有Root的解决方法

文章目录 一、问题描述二、原因分析三、解决方法 一、问题描述 在vue开发者工具devTools插件中&#xff0c;有时候会遇到没有Root或点击Root失效等问题。 正常情况如下图&#xff1a; Vue工具devtools没有root 二、原因分析 源码如下&#xff1a; 上图中的示例是name字…

C51交通控制系统的设计与实现

实验要求&#xff1a; 本题目拟设计一个工作在十字路口的交通信号灯控制系统&#xff0c;设东西方向为主干道A&#xff0c;南北方向为辅助干道B。要求&#xff1a;&#xff08;1&#xff09;用发光二极管模拟交通灯信号&#xff1b;&#xff08;2&#xff09;灵活控制主、辅干…

插入排序与霍纳规则

参考书&#xff1a;机械工业出版社《算法导论》第二版 插入排序 插入排序来自扑克牌的灵感&#xff0c;每次抽牌都要从洗好的牌堆里抽一张&#xff0c;然后与自己现有的牌比较&#xff0c;插入到合适的位置 算法步骤 由此可以看到&#xff0c;插入排序时对元素进行这样一种操…