STM32 CubeMX学习实验12:DAC数模转换

一、普通方式输出正弦波

1.1 工程配置

选择DAC通道1,不使用触发方式,不使用输出缓冲,查看输出引脚。

1.2 编写代码

定义一个数组用于存储DAC值,使用sin生成正弦波数据,开启DAC输出,在循环中将数据输出。

#include <math>//使用数学库


int main(void)
{
  /* USER CODE BEGIN 1 */
    
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_DAC_Init();
  /* USER CODE BEGIN 2 */
  uint16_t DAC_Buff[100];//用于存储要输出的DAC值
  
  //生成正弦波数据
  for(uint8_t i=0;i<100;i++)
  {
    DAC_Buff[i]=2048*(sin(i*3.1415926/50)+1);
  }
  //DAC输出
  HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      for(uint8_t i=0;i<100;i++)
      {
          //12位右对齐
          HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,DAC_Buff[i]);
      }
  }
  /* USER CODE END 3 */
}

1.3 输出波形

通过示波器可以看到PA4引脚输出的波形。

二、定时器触发方式输出正弦波

2.1 工程配置

 触发方式选择定时器触发事件,定时对DAC操作,

 

 添加DAC1的DMA,选择循环模式,循环输出DAC值。

 

 开启定时器6,假设要输出100HZ(100ms)的正弦波,从上节普通方式输出的代码中可知,一个正弦波周期分成100份,就是100个数据,10ms操作1个数据,完成一个周期就需要100ms,所以定时器分频系数设置为83,即1us计数一次,重装载值设置100-1,定时器就能100us触发一个更新事件,对DAC进行操作。

2.2 编写代码

同样用代码生成正弦波数据,开启DAC-DMA,开启定时器6,即可输出100HZ的正弦波。

int main(void)
{
  /* USER CODE BEGIN 1 */
    
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_DAC_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
  uint16_t DAC_Buff[100];//用于存储要输出的DAC值
  
  //生成正弦波数据
  for(uint8_t i=0;i<100;i++)
  {
    DAC_Buff[i]=2048*(sin(i*3.1415926/50)+1);
  }
  //开启DMA
  HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t*)DAC_Buff,100,DAC_ALIGN_12B_R);
  //开启定时器6
  HAL_TIM_Base_Start(&htim6);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      
  }
  /* USER CODE END 3 */
}

2.3 输出波形

通过示波器可以观察到引脚所输出的波形频率为100Hz,与我们计算的相同。

DAC常用操作都已经实现, 通过类似方法可以输出梯形波、三角波、锯齿波等。

三、下期一起学习定时器的输入捕获功能,获取PWM的频率和脉宽等信息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值