【STM32】HAL库 ——DAC

前期准备:

  1. STM32CubeMX
  2. STM32RCT6核心板
  3. IDE Keil(MDK-ARM)

STM32CubeMX部分

1. 配置时钟

选择STM32F103RCTx系列芯片,配置时钟的同时会自动配置IO口引脚
在这里插入图片描述
将HCLK设置为最大频率72MHz
在这里插入图片描述


2. 配置DAC

什么是DAC?

数模转换器,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器

简单来讲,就是将键盘敲上去的一堆数字,变成看不见摸不着的量

1. DAC的触发方式
  • 定时器触发:TIM2、TIM4、TIM5、TIM6、TIM7、TIM8共6个定时器可以触发
  • 外部中断触发:EXTI线路9
  • 软件触发
2. DAC可发生的波形:
  • 无波形(矩形波)
  • 噪声波形
  • 三角波
3. DAC输出电压:

DAC输出 = VREF x (DOR/4095)
2.4V < VREF范围 < 3.3V
DAC的引脚应该设置成模拟输入(AIN)模式

总结:
  • 2个DAC转换器
  • 每个转换器对应1个输出通道
  • 可采用DAC+DMA方式使用
  • 8位或者12位单调输出
  • 12位模式下数据左对齐或者右对齐
  • 同步更新功能
  • 噪声波形生成
  • 三角波形生成
  • 双DAC通道时,可同时或单独转换
  • 外部触发转换

在这里插入图片描述

  • OUT1通道输出
  • External Trigger (外部中断EXTI9触发):不勾选
  • Output Buffer (使能DAC输出缓存):DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。
  • Tigger (触发方式): None(不需要其他任何的触发源,直接使用DAC_SetChannelxData(),就可以设定输出电压的大小。如果使用了软件触发,那么,每次在使用DAC_SetChannelxData()修改输出电压后,还需要调用DAC_SoftwareTriggerCmd(),目的是使能软件触发。由于:软件触发是硬件在一个APB1时钟周期后自动关断的,于是,每次修改输出电压的值后,都要调用DAC_SoftwareTriggerCmd()方法,才能生效。)

3. 工程生成

在这里插入图片描述

在这里插入图片描述
工程管理依旧是这几个选项,然后GENERATE CODE,STM32CubeMX部分完成。



MDK 5部分

//DAC函数
• HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);     //开启DAC输出
• HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel);   //关闭DAC输出
• HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函数中不断开启,开启DAC的DMA输出
• HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel); //关闭DAC的DMA输出
• HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);  //设置DAC输出值uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel);  //获取DAC输出值

输出矩形波:

在main.c文件添加

  /* USER CODE BEGIN 2 */
  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);  //设置发生的电压
  HAL_DAC_Start(&hdac,DAC_CHANNEL_1);  //开启DAC1
  /* USER CODE END 2 */

输出电压 = ( 设定的DAC / 4096 ) * 3.3 V
=> ( 2.48 / 4096 ) * 3.3 ≈ 1.6 V

编译下载时需要选择相对应的下载器,勾选以下
在这里插入图片描述
运行即可

如图为PA4(DAC)引脚电压:
在这里插入图片描述

输出三角波:

重新点开CubeMX工程,重新配置
在这里插入图片描述

  • Tigger (触发方式): 定时器2
  • 波形生成模式(Wave generation mode) :
    三角波发生器(Triangle wave generation)勾选
    噪声波形(noise wave generation)不选择
  • 最大三角波幅(Maximum Triangle Amplitude)4095
    如果最大电压是3.3V,那么三角波幅值为3.3V
    0 ~ 4095 对应 0V ~ 3.3V

在这里插入图片描述
配置定时器,频率为2MHZ,配置TIM有讲过,这里和下面涉及TIM的知识点快进不再讲解,不了解的具体请看
【STM32】HAL库 CubeMX例程四—定时器中断(附工程源码)

在这里插入图片描述
由图可知三角波一个周期是一上一下,一上(一下)周期是4095,两趟就是4095 * 2

因此三角波频率 = (定时器频率 / (4095 * 2))
在main.c添加

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim2);  //开启定时器2
  HAL_DAC_Start(&hdac, DAC_CHANNEL_1);  //开始DAC1
  /* USER CODE END 2 */

用示波器看到的就是三角波
在这里插入图片描述

本期工程文档——>Gitee

<think>嗯,用户想用STM32的标准通过ADC采集DAC输出的数据,我得先理清楚这个流程。首先,用户可能需要知道ADC和DAC的基本配置步骤,以及它们如何协同工作。 用户提到的是标准,所以应该用STM32的标准外设,而不是HAL。我记得标准的配置步骤和HAL有些不同,比如寄存器的直接操作更多。首先,DAC部分需要初始化,设置对应的GPIO为模拟模式,因为DAC输出需要用到特定的引脚,比如PA4或PA5。然后配置DAC的触发方式,如果不需要外部触发,可能使用软件触发,然后写入数据到DAC的数据保持寄存器。 接下来是ADC的配置。ADC需要配置对应的输入通道,比如如果DAC输出到PA4,那ADC可能用通道1(不同的STM32型号可能通道不同,需要查数据手册)。ADC的触发方式如果是软件触发的话,配置好采样时间和转换模式。连续转换还是单次转换?可能单次转换,然后手动启动每次转换。 时钟配置也很重要,DAC和ADC都需要时钟使能。RCC_APB2Periph_ADC1和RCC_APB1Periph_DAC需要打开。GPIO的时钟也要使能,比如RCC_APB2Periph_GPIOA。 在代码结构上,先初始化系统时钟,然后配置GPIO、DAC、ADC。主循环里,先设置DAC的输出值,然后启动ADC转换,等待转换完成,读取ADC的值。可能需要处理数据对齐,比如ADC是12位右对齐,DAC也是12位,所以写入和读取的时候要注意移位操作。 用户可能需要示例代码,所以需要给出具体的初始化函数和主循环逻辑。比如DAC_InitTypeDef和ADC_InitTypeDef的结构体配置,GPIO_InitTypeDef的设置。此外,注意DAC和ADC的通道使能,比如DAC_Channel1启用,ADC的规则组配置。 还要注意一些细节,比如ADC的校准,标准中是否有必要执行校准流程?可能需要调用ADC_ResetCalibration和ADC_StartCalibration,等待校准完成。此外,ADC转换后的数据对齐方式,是否需要调整,比如设置为右对齐,这样读取的时候直接取寄存器的值即可。 可能用户会遇到的问题包括ADC采集的值不正确,这时候需要检查GPIO配置是否正确,DAC是否输出了正确的电压,ADC的通道和引脚是否对应,采样时间是否足够,时钟是否使能,以及校准是否完成。 另外,用户可能需要了解如何验证结果,比如通过调试查看ADC的值是否随DAC的设置变化,或者用万用表测量DAC输出引脚电压是否匹配预期。 最后,用户的问题可能涉及更复杂的场景,比如DMA传输、多通道ADC采集,或者中断方式读取ADC数据,但当前问题可能只需要基本的轮询方式。不过生成相关问题的时候可以提到这些高级应用,引导用户深入。</think>### STM32标准实现ADC采集DAC输出教程 #### 硬件连接与原理 当使用STM32DAC输出模拟信号并通过ADC采集时,需确保: 1. DAC输出引脚与ADC输入通道直连(如DAC1通道1输出到PA4,ADC1通道1采集PA0) 2. 共享参考电压源(VDDA和VSSA) 3. 通过$V_{DAC} = \frac{DAC\_value}{4095} \times V_{ref}$计算理论输出电压[^1] #### 配置步骤 1. **时钟配置** ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); ``` 2. **GPIO初始化** ```c // DAC通道1对应PA4 GPIO_InitTypeDef gpio; gpio.GPIO_Pin = GPIO_Pin_4; gpio.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入模式 GPIO_Init(GPIOA, &gpio); ``` 3. **DAC配置** ```c DAC_InitTypeDef dac; dac.DAC_Trigger = DAC_Trigger_None; // 软件触发 dac.DAC_WaveGeneration = DAC_WaveGeneration_None; dac.DAC_OutputBuffer = DAC_OutputBuffer_Enable; DAC_Init(DAC_Channel_1, &dac); DAC_Cmd(DAC_Channel_1, ENABLE); ``` 4. **ADC配置** ```c ADC_InitTypeDef adc; adc.ADC_Mode = ADC_Mode_Independent; adc.ADC_ScanConvMode = DISABLE; // 单通道模式 adc.ADC_ContinuousConvMode = DISABLE;// 单次转换 adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; adc.ADC_DataAlign = ADC_DataAlign_Right; adc.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &adc); // 配置通道0(PA0)的采样时间 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1, ENABLE); // ADC校准 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ``` #### 数据采集流程 ```c // 设置DAC输出值(0-4095) DAC_SetChannel1Data(DAC_Align_12b_R, 2048); // 启动ADC转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成 uint16_t adc_value = ADC_GetConversionValue(ADC1); ``` #### 完整示例代码 ```c #include "stm32f10x.h" void ADC_DAC_Init(void) { // 初始化代码如前述配置步骤 } int main(void) { ADC_DAC_Init(); while(1) { // 设置DAC输出电压(示例值) static uint16_t dac_val = 0; DAC_SetChannel1Data(DAC_Align_12b_R, dac_val); dac_val = (dac_val + 100) % 4096; // 启动ADC转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); uint16_t adc_result = ADC_GetConversionValue(ADC1); // 此处可添加数据处理逻辑 Delay_ms(500); } } ``` #### 验证方法 1. 使用万用表测量DAC输出引脚电压 2. 通过调试模式观察`adc_result`数值 3. 验证$\frac{ADC\_value}{4095} \times 3.3V ≈ \frac{DAC\_value}{4095} \times 3.3V$是否成立 #### 注意事项 1. 确保ADC和DAC使用相同的参考电压源 2. 采样时间需满足信号稳定要求 3. 避免模拟信号路径引入噪声 4. DAC输出范围需在ADC输入量程内(0-3.3V)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值