前期准备:

  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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐