OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 147|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第三十八章 DAC输出三角波实验

[复制链接]

1070

主题

1081

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4443
金钱
4443
注册时间
2019-5-8
在线时间
1199 小时
发表于 2024-5-7 09:55:50 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-5-6 09:55 编辑

第三十八章 DAC输出三角波实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章将使用软件的方式控制STM32F103的DAC输出指定幅值、频率和个数的三角波。通过本章的学习,读者将学习到DAC的使用。
本章分为如下几个小节:
38.1 硬件设计
38.2 程序设计
38.3 下载验证

38.1 硬件设计
38.1.1 例程功能
1. 按下WKUP按键,PA4引脚输出100个三角波1(幅值3.3V,频率100Hz,采样点2000)
2. 按下KEY0按键,PA4引脚输出100个三角波2(幅值3.3V,频率100Hz,采样点20)
3. LED0闪烁,提示程序正在运行

38.1.2 硬件资源
1. LED
       LED0 - PB5
2. 正点原子2.8/3.5/4.3/7/10寸TFTLCD模块
3. 按键
       WKUP - PA0
       KEY0 - PE4
4. DAC
       Channel1 - PA4

38.1.3 原理图
本章实验使用的DAC为STM32F103的片上资源,因此没有对应的连接原理图。

38.2 程序设计
38.2.1 HAL库的DAC驱动
本章实验与上一章实验十分相似,上一章实验使用按键控制DACChannel1输出“离散”的电压,而本章实验的是使用软件算法控制DAC Channel1输出的电压,使之输出一个三角波,因此大部分内容都是相似的,以及操作DAC的方式都是一样的,因此请见第38.2.1小节中HAL库的DAC驱动的相关内容。

38.2.2 DAC驱动
本章实验的DAC驱动主要负责向应用层提供DAC的初始化以及控制DAC输出指定幅值、频率和个数的三角波的函数。本章实验中,DAC的驱动代码包括dac.c和dac.h两个文件。
本章实验DAC驱动中对DAC的初始化与上一章实验中对DAC的初始化方式一致,请见第38.2.2小节中DAC初始化的相关内容提供。本小节仅介绍通过软件控制DAC输出三角波的函数,如下所示:
  1. /**
  2. *@brief   设置DAC输出三角波
  3. *@param   max_value: 三角波波峰电压数字量
  4. *@param   interval: 每个采样点的时间间隔,单位:微妙
  5. *@param   samples: 一个三角波周期采样点的个数
  6. *@param   number: 输出三角波的个数
  7. *@retval  无
  8. */
  9. voiddac_triangular_wave(  uint16_t max_value,
  10.                              uint16_t interval,
  11.                              uint16_t samples,
  12.                              uint16_t number)
  13. {
  14.     uint16_t incval;
  15.     uint16_t curval;
  16.     uint16_t sample_index;
  17.     uint16_t wave_index;
  18.    
  19.     /* 确保采样点个数为偶数 */
  20.    samples = ((samples + 1) >> 1) << 1;
  21.     /* 计算每个采样点的步进值 */
  22.    incval = max_value / (samples >> 1);
  23.     if (incval == 0)
  24.     {
  25.          return;
  26.     }
  27.    
  28.     for (wave_index=0; wave_index<number; wave_index++)
  29.     {
  30.          curval = 0;
  31.          HAL_DAC_SetValue(&g_dac_handle, DAC_DACX_CHY, DAC_ALIGN_12B_R, curval);
  32.          
  33.          /* 输出上升沿 */
  34.          for (sample_index=0; sample_index<(samples >> 1); sample_index++)
  35.          {
  36.              curval += incval;
  37.              HAL_DAC_SetValue(   &g_dac_handle,
  38.                                  DAC_DACX_CHY,
  39.                                  DAC_ALIGN_12B_R,
  40.                                  curval);
  41.              delay_us(interval);
  42.          }
  43.          
  44.          /* 输出下降沿 */
  45.          for (sample_index=0; sample_index<(samples >> 1); sample_index++)
  46.          {
  47.              curval -= incval;
  48.              HAL_DAC_SetValue(   &g_dac_handle,
  49.                                  DAC_DACX_CHY,
  50.                                  DAC_ALIGN_12B_R,
  51.                                  curval);
  52.              delay_us(interval);
  53.          }
  54.     }
  55. }
复制代码
可以看到,该函数就是每间隔一段时间就修改一次DAC的输出电压,以控制DAC输出指定的三角波,对于该函数的实现,读者无需深究,仅需会使用该函数即可。

38.2.3 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     uint8_t t = 0;
  4.     uint8_t key;
  5.    
  6.    HAL_Init();                         /* 初始化HAL库 */
  7.    sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
  8.    delay_init(72);                     /* 初始化延时 */
  9.    usart_init(115200);                 /* 初始化串口 */
  10.    led_init();                         /* 初始化LED */
  11.    key_init();                         /* 初始化按键 */
  12.    lcd_init();                         /* 初始化LCD */
  13.    dac_init();                         /* 初始化DAC */
  14.    
  15.    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
  16.    lcd_show_string(30, 70, 200, 16, 16, "DACTriangular Wave TEST", RED);
  17.    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  18.    
  19.    lcd_show_string(30, 110, 200, 16, 16, "WK_UP:Wave1KEY0:Wave2", RED);
  20.    
  21.     while (1)
  22.     {
  23.          key = key_scan(0);
  24.          if (key == WKUP_PRES)
  25.          {
  26.              /* DAC输出三角波1,幅值3.3V,频率100Hz,采样点2000 */
  27.              lcd_show_string(30, 130, 200, 16, 16, "DACWave1", BLUE);
  28.              dac_triangular_wave(4095, 5, 2000, 100);
  29.              lcd_show_string(30, 130, 200, 16, 16, "DACNone", BLUE);
  30.          }
  31.          else if (key == KEY0_PRES)
  32.          {
  33.              /* DAC输出三角波2,幅值3.3V,频率100Hz,采样点20 */
  34.              lcd_show_string(30, 130, 200, 16, 16, "DACWave2", BLUE);
  35.              dac_triangular_wave(4095, 500, 20, 100);
  36.              lcd_show_string(30, 130, 200, 16, 16, "DACNone", BLUE);
  37.          }
  38.          
  39.          if (++t == 20)
  40.          {
  41.              t = 0;
  42.              LED0_TOGGLE();
  43.          }
  44.          
  45.          delay_ms(10);
  46.     }
  47. }
复制代码
应用代码中会初始化DAC Channel1(PA4引脚),完成初始化后,便不断地扫描按键,并根据扫描到的按键,控制DAC Channel1输出指定幅值、频率和个数三角波。

38.3 下载验证
在完成编译和烧录操作后,便可分别按下KEY0按键和WKUP按键控制DAC Channel1输出不同类型的三角波,DAC Channel1输出的三角波可通过示波器观察PA4引脚(DAC Channel1输出引脚)看到。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-7 19:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表