• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

STM32F103DAC输出直流、锯齿波、三角波,正弦波

武飞扬头像
猪突猛进进进
帮助1

一、DAC基本原则原理

学新通

学新通 学新通

 学新通

学新通二、 各波形输出及cubeMx设置

1、直流信号

cubeMx配置:

学新通

学新通

伪代码: 

  1.  
    int main(void)
  2.  
    {
  3.  
    HAL_Init();
  4.  
    SystemClock_Config();
  5.  
    MX_GPIO_Init();
  6.  
    MX_DAC_Init();
  7.  
     
  8.  
    HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12_R,248);//248/4096*3.3=0.2V
  9.  
     
  10.  
    //开启DAC通道1
  11.  
    if(HAL_DAC_Start(&hdac,DAC_CHANNEL_1)!=HAL_OK)
  12.  
    {
  13.  
    Error_Handler();
  14.  
    }
  15.  
    }
  16.  
     
  17.  
    while(1)
  18.  
    {
  19.  
    }
学新通

 实测结果:(手持示波器

学新通

 2、锯齿波

cubeMx配置与上一题一致。

伪代码:

  1.  
    int main()
  2.  
    {
  3.  
    int dacValue;
  4.  
    HAL_Init();
  5.  
    SystemClock_Config();
  6.  
    MX_GPIO_Init();
  7.  
    MX_DAC_Init();
  8.  
     
  9.  
     
  10.  
    while(1)
  11.  
    {
  12.  
    for(dacValue=o;dacValue<20;dacValue )//循环次数和波的阶梯化相关,循环次数越多波越光滑
  13.  
    {
  14.  
    HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12_R,124*dacValue);//最高2480/4096*3.3=1V
  15.  
     
  16.  
    //开启DAC通道1
  17.  
    if(HAL_DAC_Start(&hdac,DAC_CHANNEL_1)!=HAL_OK)
  18.  
    {
  19.  
    Error_Handler();
  20.  
    }
  21.  
    HAL_Delay(1);//频率和延时时间以及阶梯数有关
  22.  
    ]
  23.  
    }
学新通

实测结果:(Vpp有些误差)

 学新通

 3、定时器2触发DAC产生三角波

型号:学新通 

学新通

Timer2在 APB1总线上

cubeMx配置:

学新通

学新通

 伪代码:

  1.  
    int main()
  2.  
    {
  3.  
     
  4.  
    HAL_Init();
  5.  
    SystemClock_Config();
  6.  
    MX_GPIO_Init();
  7.  
    MX_TIM2_Init();
  8.  
    HAL_TIM_Base_Start(&htim2);//在定时器厨师话函数中添加也可以
  9.  
    MX_DAC_Init();
  10.  
     
  11.  
    //配置DHR12RD寄存器,对应波形的最低电压
  12.  
    if(HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0x0)!=HAL_OK)
  13.  
    {Error_Handler();}
  14.  
    //开启DAC通道一
  15.  
    if(HAL_DAC_Start(&hdac,DAC_CHANNEL_1)!=HAL_OK)
  16.  
    {Error_Handler();}
学新通

实测结果:

学新通

学新通

         因为APB1总线的频率为16Mhz,16000_000/(15 1)/(1 1)/(1023 1)=488hz,15,1,1023分别是在cubeMx中配置的预分频系数,自动装载值,三角波最大幅值,所以实测频率为488hz。

4、定时器6触发DAC转换,使用DMA方式触发产生正弦波 (APB1总线改为72Mhz)

cubeMx配置:

DAC DMA转换方式

学新通

 学新通

 Timer6学新通

 伪代码:

学新通

 实测结果:

学新通

 频率等于:72000_000/16/255/32=549hz,采了32个点,采点越多越光滑。

波表的形式要提前算好波表不太方便,第二种方法

  1.  
    #define PI 3.1415926
  2.  
    #define DAC_Num 32
  3.  
     
  4.  
    void SineWave_Data(uint16_t cycle,uint16_t *D)
  5.  
    {
  6.  
    uint16_t i;
  7.  
    // 130是一个输出偏置,将输出波形都往上拉0.01v,621是限制输出波形幅度
  8.  
    for(i=0;i<cycle;i )
  9.  
    {
  10.  
    D[i]=621*(sin((2.0*PI*i)/(cycle-1)) 1) 130;
  11.  
    }
  12.  
    }
  13.  
     
  14.  
    int main()
  15.  
    {
  16.  
    Uint16_t dac_data[DAC_Num ];
  17.  
     
  18.  
    MX_GPIO_Init();
  19.  
    MX_DMA_Init();
  20.  
    MX_DAC_Init();
  21.  
    MX_TIM6_Init();
  22.  
    HAL_TIM_Base_Start(&htim6);//记得初始化时钟
  23.  
     
  24.  
    memset(dac_data,0,sizeof(dac_data));
  25.  
    SineWave_Data(DAC_Num ,dac_data);
  26.  
    if(HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t *)dac_data,dac_num[i],DAC_ALIGN_12B_R)!=HAL_OK)
  27.  
    {
  28.  
    Error_Handler();
  29.  
    }
  30.  
    }
学新通

实测结果:

 (具体参数不记得了,预分频系数为0,自动装载系数为1)学新通

 这个方法可以扩展扫频,下面是我做的一个1K到40K的扫频,代码就不展出献丑了。

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcjfgf
系列文章
更多 icon
同类精品
更多 icon
继续加载