253|0

65

帖子

1

TA的资源

一粒金砂(中级)

【Follow me第二季第3期】DAC配置生成波形及性能测试 [复制链接]

本帖最后由 breeze_i 于 2024-12-17 21:25 编辑

简介:本次实验使用RA6M5的片内外设DAC模块,产生三角波和正弦波,驱动LED,实现呼吸灯效果。

打开用户手册,找到DAC模块,框图如下:

PixPin_2024-12-14_23-24-42.png

可以看到,这是一个转换精度12为的ADC,有两路输出,在原理图中看到DA0对应的引脚是P014。本次将DAC输出通过杜邦线连接到LED3上。

PixPin_2024-12-14_23-29-20.png

PixPin_2024-12-14_23-31-18.png
二、模块配置
打开e2studio,如图打开FSP配置界面:添加DAC模块。
PixPin_2024-12-14_23-38-24.png
PixPin_2024-12-14_23-41-53.png

三、三角波、正弦波实现

第一个DAC_output()是三角波,第二个函数DAC_output_sineware()是生成正弦波。

fsp_err_t DAC_output(void)
{
    static int16_t a=1;
    gs_dac_value=(uint16_t)(gs_dac_value+a);
    if(gs_dac_value>=0x0FFF)
//    if (gs_dac_value >= 0x5)
    {
        a = -1;
    }
    else if (gs_dac_value == 0)
    {
        a = 1;
    }

    fsp_err_t status = R_DAC_Write(&g_dac0_ctrl, gs_dac_value);

    return status;
}

fsp_err_t DAC_output_Sinewave(void)
{
    fsp_err_t ret;
    uint64_t currenttime=gs_dwTick;
//    uint16_t DAC_value=0;
    uint64_t t_ms=(currenttime-gs_starttime);       //ms
    double t_s   =(double)t_ms/1000;//(double)(t_ms/1000);
    DAC_value=(uint16_t)((sin(t_s)+1)/2*4096);
    ret = R_DAC_Write(&g_dac0_ctrl, DAC_value);
    return ret;
}

四、实验现象

使用杜邦线将P014和P008短接,将工程中P008引脚去使能,即保持在高阻态。

1.在10ms任务中调用三角波生成函数DAC_outoput();实验现象如视频所示(可能是白天太亮了,手机摄像头录的LED3变化不明显)。

20241215_090931

2.在10ms任务中调用三角波生成函数DAC_outoput_Sineware();实验现象如视频所示(这次把旁边的绿色led2关掉试试),可以看到红色LED3的明暗变化,实现了呼吸灯效果,然后打开FreeMaster看一下DAC生成的波形是按照正弦规律变化的。

20241215_092632

下面配置ADC模块。

按照如下步骤在DAC工程中添加ADC模块

属性设置:

我选用的是Channel0,P000引脚,不使用中断。采样精度选最高的12bit

点击Generate Project Content生成代码。

驱动函数封装

在src文件夹下新adc.h,adc.c两个文件。

adc.c添加代码如下

#include "adc.h"
volatile bool scan_complete_flag = false;
uint16_t gs_adc_value=0;
void ADC_Init()
{
fsp_err_t status = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
if(status!=FSP_SUCCESS)
{
while(1);
}
status = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
if(status!=FSP_SUCCESS)
{
while(1);
}
}
//void adc_callback(adc_callback_args_t * p_args)
//{
// FSP_PARAMETER_NOT_USED(p_args);
// scan_complete_flag = true;
//}
void ADC_READ_DATA()
{
fsp_err_t status = R_ADC_ScanStart(&g_adc0_ctrl);
adc_status_t adc_status;
do{
status=R_ADC_StatusGet(&g_adc0_ctrl, &adc_status);
}while(adc_status.state==ADC_STATE_SCAN_IN_PROGRESS);
//if(scan_complete_flag==true)
{
status = R_ADC_Read(&g_adc0_ctrl,ADC_CHANNEL_0, &gs_adc_value);
// scan_complete_flag = false;
}
}


注意ADC转换需要时间,尽管只要0.4us,但这个时间对mcu来说还是很长的,在开始扫描之后需要等待转换完成之后,才能读取到数据。

 

PixPin_2024-12-17_21-10-41.png

 

 

然后再在hal_entry()函数中中调用ADC_Init()函数,初始化ADC模块。

PixPin_2024-12-17_09-28-23.png

在1ms任务中调用ADC 读取函数

PixPin_2024-12-17_09-29-37.png

使用Freemaster观测dac模块设定输出值和adc模块采集到的电压值,可以看到两条曲线基本重合,说明dac模块的输出还是挺准的。

PixPin_2024-12-17_20-58-45.png


 

 

 

 

 

 

个人签名

学习使人进步


回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表