你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于 NUCLEO-L4R5ZI 实验板的 DAC 信号输出

[复制链接]
Lumhao 发布时间:2020-3-2 16:59
前言
NUCLEO-L4R5ZI是 ST 新推出的一款以 L4+系列STM32L4R5ZI芯片为核心的实验板。在当前便携式、低功耗应用越来越广泛的情况下,L4+系列芯片的确有很大吸引力:核心最高工作频率 120MHz,比 L4 系列的有40MHz 的提高,最大片内 FLASH 和 SRAM也增加了一倍,分别达到 2 Mbytes 和 640 Kbytes。不多介绍,直接上板子实物图如下:
- {- \2 Z) l+ i; }0 r' X
11.jpg

  y; p. y, o" {$ {; f" v) Y
拿到板子后,最想试用一下数模转换 DAC 功能,最简便的方法就是参考丰富的 ST例程。于是乎直接打开 STM32L4+系列的 Cube 库文件夹 STM32Cube_FW_L4_V1.11.0,这才发现 NUCLEO-L4R5ZI板子的 DAC 的例子程序还没有加入进去。没有也不是事儿,同一个系列的 MCU 有很多相似之处,再此参考 NUCLEO-L496ZG 的例子,稍作修改之后即可。

3 w9 ~/ N4 S. ^" N
实验步骤

" y$ A/ y/ k$ M. T) D% B. k3 f
一, 建立基于 NUCLEO-L4R5ZI实验板的 DAC 测试工程

4 c6 \- G7 h# C
1. 打开 STM32CubeMX,新建工程,选择实验板型号:NUCLEO-L4R5ZI,并选择默认引脚配置。
2. 在 Pinout 页面使能 DAC,设置DAC1 的 OUT1 mode 为 Connected toexternal pin only。设置 TIM6 为Activated,用作 DAC 的触发。设置 USART3 的 mode为 disable,配置USB_OTG_FS 的 mode 为 disable。
3. 在 Clock Configuration 页将 HSI选为高速时钟源(因为实验板上没有表贴8MHz 外部晶振 X3),同时将 PLLM1设置为“/2”。将 RCC 中的 HSE设置为Disable。
4. 在 Configuration 页中为 DAC 添加一个 DMA 传输通道 DAC1_CH1,其传输模式为 circular,数据宽度为 Byte。使能 NVIC 中的 EXTI Line[15:10] interrupts,作为用户按键的中断处理函数。
5. 在 Project 菜单项中选择 Project Settings 进行工程相关设置。工程名为DACWaveGen,选择本机 IDE 工具链。
6. 生成工程代码,在 main()函数主循环中加入 LED 点亮程序,下载程序到实验板,初步测试基本功能正常。代码如下:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7, GPIO_PIN_SET);
7. 在 main.c 文件中加入变量,代码如下
__IOuint8_t ubKeyPressed = SET;
__IOuint8_t ubSelectedWavesForm = 1;
staticDAC_ChannelConfTypeDef sConfig;
constuint8_t aEscalator8bit[6] = {0x0, 0x33, 0x66, 0x99, 0xCC, 0xFF};
在main.c 文件中加入一个用户按键外部中断回调函数,一个定时器配置函数和三个波形生成函数,代码如下:
外部中断回调函数:
voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
ubKeyPressed= 1;
ubSelectedWavesForm++;
if(ubSelectedWavesForm== 4) ubSelectedWavesForm = 1;
}
定时器配置函数:
voidTIM6_Config(void)
{
TIM_MasterConfigTypeDefsMasterConfig;
htim6.Init.Period= 0x7FF;
htim6.Init.Prescaler= 0;
htim6.Init.ClockDivision= 0;
htim6.Init.CounterMode= TIM_COUNTERMODE_UP;
htim6.Init.RepetitionCounter= 0;
HAL_TIM_Base_Init(&htim6);
sMasterConfig.MasterOutputTrigger= TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode= TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim6,&sMasterConfig);
HAL_TIM_Base_Start(&htim6);
}
三角波生成函数:
staticvoid DAC_Ch1_TriangleConfig(void)
{
if(HAL_DAC_Init(&hdac1) != HAL_OK)
{Error_Handler(); }
sConfig.DAC_Trigger= DAC_TRIGGER_T6_TRGO;
sConfig.DAC_OutputBuffer= DAC_OUTPUTBUFFER_ENABLE;
if(HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{Error_Handler(); }
if(HAL_DACEx_TriangleWaveGenerate(&hdac1, DAC_CHANNEL_1,
DAC_TRIANGLEAMPLITUDE_1023)!= HAL_OK)
{Error_Handler(); }
if(HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK)
{Error_Handler(); }
if(HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100) !=
HAL_OK)
{Error_Handler(); }
}
阶梯波生成函数:
staticvoid DAC_Ch1_EscalatorConfig(void)
{
if(HAL_DAC_Init(&hdac1) != HAL_OK)
{Error_Handler(); }
sConfig.DAC_Trigger= DAC_TRIGGER_T6_TRGO;
sConfig.DAC_OutputBuffer= DAC_OUTPUTBUFFER_ENABLE;
if(HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{Error_Handler(); }
if(HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t *)aEscalator8bit, 6,
DAC_ALIGN_8B_R)!= HAL_OK)
{Error_Handler(); }
}
噪声波生成函数:
staticvoid DAC_Ch1_NoiseConfig(void)
{
if(HAL_DAC_Init(&hdac1) != HAL_OK)
{Error_Handler(); }
sConfig.DAC_Trigger= DAC_TRIGGER_T6_TRGO;
sConfig.DAC_OutputBuffer= DAC_OUTPUTBUFFER_ENABLE;
if(HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
{Error_Handler(); }
if(HAL_DACEx_NoiseWaveGenerate(&hdac1, DAC_CHANNEL_1,
DAC_TRIANGLEAMPLITUDE_1023)!= HAL_OK)
{Error_Handler(); }
if(HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK)
{Error_Handler(); }
if (HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100) !=
HAL_OK)
{Error_Handler(); }
}
最后在main()函数的主循环中加入程序分支控制,代码如下:
if(ubKeyPressed != RESET)
{
HAL_DAC_DeInit(&hdac1);
if(ubSelectedWavesForm == 1)
{
DAC_Ch1_TriangleConfig();
}
elseif(ubSelectedWavesForm == 2)
{
DAC_Ch1_EscalatorConfig();
}
elseif(ubSelectedWavesForm == 3)
{
DAC_Ch1_NoiseConfig();
}
ubKeyPressed= RESET;
}
' c6 ?; d9 e+ l* N
测量结果
0 ]* T/ {2 Q$ ~% r' f# }8 t0 n
将上述程序编译下载至开发板,通过 USB线将开发板与电脑相连,用示波器测量PA4引脚信号,如下图所示:

1 q* X6 {9 k# w5 d" O; \' _$ l6 S
22.jpg
% d2 X; |; a$ I  R; n, l% p
系统上电之后,可以看到三角波输出,如下图:
# u4 s4 |' I+ i
33.jpg
# E( J7 q/ e8 d" F8 F; M$ V
按下用户按键,输出阶梯波形,如下图:
- q( f* d, N  U  u" ~0 w
44.jpg
9 h1 z. F- |: c8 s8 q; d1 L* {
再次按下用户按键,输出噪声波形,如下图:

1 O& |5 y6 q4 M, `: a0 h  u  H# @! t
55.jpg

: e3 }7 {$ i" N( C( A/ O, _
将噪声波沿时间轴展开,如下图
; L' O, W: A* n; Z3 X
66.jpg

( C# p( l# E3 n  n& T% C9 [
% `  N4 s  A) P! x
相关STM32CubeMX 工程文件,详见附件。
基于NUCLEO-L4R5ZI_实验板的DAC_信号输出.zip (1.54 MB, 下载次数: 9)
收藏 评论1 发布时间:2020-3-2 16:59

举报

1个回答
李康1202 回答时间:2020-3-3 14:54:17
学习了

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版