查看: 700|回复: 1

【瑞萨RA4系列开发板体验】用DAC输出正弦波以及余弦波

[复制链接]

116

主题

134

帖子

3778

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3778
发表于 2023-2-8 15:44:07 | 显示全部楼层 |阅读模式
【瑞萨RA4系列开发板体验】用DAC输出正弦波以及余弦波
作者:hehung


前言
本文的目的在与使用DAC模块输出正弦波与余弦波波形,用于测试RA4M2单片机的DAC输出功能,本文实现如下功能:
  • 本文基于KEIL开发环境;
  • 使用了两路DAC(RA4M2本来也只有两路DAC),DAC0输出正弦波,DAC1输出余弦波;
  • 示波器用于观察正弦波波形以及余弦波波形。
本文中实用到了所有驱动都能在我之前的文章中找到使用方法,有需要请参考。


硬件连接
查看原理图,了解芯片的DAC引脚的映射关系,我们才能接下来的工作。
RA4M2有两路DAC,没录DAC可以输出一个DAC信号。
本文两路DAC都使用到了,DAC0连接P014,DAC1连接P015。


RASC配置
知道了DAC的引脚映射关系,接下来就开始我们的驱动配置了,打开RASC,打开方式不细说,请参考我之前的文章。

使能DAC引脚
如下图,选中Pins->AnalogAC,使能ADC0与DAC1,会自动匹配引脚。


DAC详细配置
因为使用到了两路DAC,所以需要配置两个DAC Stack,配置方式一样,要注意两路DAC的unit是不一样的,根据实际情况填写0或者1。
配置十分简单,不做赘述,详见下图。




代码实现
我新建了一个app_dac.c以及app_dac.h,代码实现逻辑不细说,瑞萨已经封装的很好了,理解起来很简单。
app_dac.c
我在封装了一层,主要包括DAC初始化以及DAC输出。
Dac_OutputVal()输出电压值(0到4096分别表示0~3.3V)
  1. /*
  2. @hehung
  3. 2022-12-01
  4. */
  5. #include "hal_data.h"
  6. #include "app_dac.h"

  7. /* Initialize the DAC */
  8. void Dac_Init(void)
  9. {
  10.     fsp_err_t err = FSP_SUCCESS;
  11.        
  12.     /* Initializes the dac. */
  13.     err = R_DAC_Open(&g_dac0_ctrl, &g_dac0_cfg);
  14.         /* Handle any errors. This function should be defined by the user. */
  15.     assert(FSP_SUCCESS == err);
  16.        
  17.         /* Initializes the dac1. */
  18.     err = R_DAC_Open(&g_dac1_ctrl, &g_dac1_cfg);
  19.         /* Handle any errors. This function should be defined by the user. */
  20.     assert(FSP_SUCCESS == err);
  21. }

  22. /* Control the DAC output a digit valtage value */
  23. void Adc_OutputVal(e_Dac_HwUnitType dac_num, uint16_t val)
  24. {
  25.         fsp_err_t err = FSP_SUCCESS;
  26.        
  27.         if (DAC_DAC0 == dac_num)
  28.         {
  29.                 err = R_DAC_Start(&g_dac0_ctrl);
  30.                 /* Handle any errors. This function should be defined by the user. */
  31.                 assert(FSP_SUCCESS == err);
  32.                
  33.                 R_DAC_Write(&g_dac0_ctrl, val);       
  34.         }
  35.         else
  36.         {
  37.                 err = R_DAC_Start(&g_dac1_ctrl);
  38.                 /* Handle any errors. This function should be defined by the user. */
  39.                 assert(FSP_SUCCESS == err);
  40.                
  41.                 R_DAC_Write(&g_dac1_ctrl, val);
  42.         }
  43. }
复制代码
app_dac.h
  1. /*
  2. @hehung
  3. 2022-12-01
  4. */

  5. #ifndef APP_DAC_H_
  6. #define APP_DAC_H_

  7. #include "stdint.h"

  8. typedef enum
  9. {
  10.         DAC_DAC0 = 0,
  11.         DAC_DAC1
  12. } e_Dac_HwUnitType;

  13. extern void Dac_Init(void);
  14. extern void Adc_OutputVal(e_Dac_HwUnitType dac_num, uint16_t val);

  15. #endif
复制代码


主函数实现
主函数中用于输出正弦波以及余弦波,每一秒输出一次。
输出算法实用到了数学库math.h中的sin公式。
sin都学过,不做赘述,参数参数0~2π会输出一个正弦波形,代码中没1毫秒输出一次,sin函数的参数的增长步长为0.05。详细代码见下。
  1. #define PI_MATH           (3.14)
  2. #define PI_DOUBLE         (PI_MATH * 2)
  3. uint16_t dac_value[2];
  4. double time_cnt;
  5. void hal_entry(void)
  6. {
  7.         /* Initialize the uart for implement the 'printf' and 'scanf' */
  8.         Uart_Init();
  9.         /* Initialize the I2c */
  10.         I2c_Init();
  11.         /* Initialize the OLED */
  12.         OLED_Init();
  13.         /* Initialize the ADC */
  14.         Adc_Init();
  15.         /* Initialize the DAC */
  16.         Dac_Init();
  17.        
  18.         OLED_ShowString(12, 0, (const uint8_t*)"R7FA4M2AD3CFP", 16, 1);
  19. //    OLED_ShowHzStringRow(32, 24, (const char*)"电子发烧友", 1);
  20.     OLED_ShowString(0, 16, (const uint8_t*)"elecfans", 16, 1);
  21.         OLED_ShowString(64, 16, (const uint8_t*)"|hehung", 16, 1);
  22.         OLED_ShowString(32, 32, (const uint8_t*)"DAC Test", 16, 1);
  23.     OLED_Refresh_Gram();
  24.        
  25.         while (1)
  26.         {
  27.                 dac_value[0] = (uint16_t)(sin(time_cnt) * (float)2048) + 2048;
  28.                 dac_value[1] = (uint16_t)(sin(time_cnt + 0.5*PI_MATH) * (float)2048) + 2048;

  29.                 Adc_OutputVal(DAC_DAC0, dac_value[0]);
  30.                 Adc_OutputVal(DAC_DAC1, dac_value[1]);
  31.                 time_cnt = (time_cnt > PI_DOUBLE) ? (0.0): (time_cnt + 0.05f);

  32.                 R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
  33.         }

  34. #if BSP_TZ_SECURE_BUILD
  35.     /* Enter non-secure code */
  36.     R_BSP_NonSecureEnter();
  37. #endif
  38. }
复制代码


显示效果
从示波器的观测波形可以看出,输出波形还是比较完美的,说明RA4M2的DAC功能还是比较强大,能够模拟各种波形输出。


视频演示

回复

使用道具 举报

3

主题

195

帖子

1485

积分

金牌会员

Rank: 6Rank: 6

积分
1485
发表于 2023-3-14 10:33:03 | 显示全部楼层

芯片功能挺多的窝
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户排行榜

RA助手

主题: 116帖子:134精华:0

RA_Lance

主题: 92帖子:132精华:9

lugl

主题: 44帖子:133精华:0

xujiwei263

主题: 16帖子:73精华:0

books咦

主题: 11帖子:11精华:2

Juggernaut

主题: 9帖子:95精华:0
快速回复 返回顶部 返回列表