STM32G4 电机外设篇(四)DAC输出电流波形 + CAN通讯

article/2025/7/2 5:40:50

目录

  • 一、STM32G4 电机外设篇(四)DAC输出电流波形 + CAN通讯
      • 1 DAC输出电流波形
        • 1.1 STM32CubeMX配置和Keil代码
        • 1.2 实验现象
      • 2 CAN/CANFD通讯
        • 2.1 STM32CubeMX配置和Keil代码
        • 2.2 实验现象
    • 附学习参考网址
      • 欢迎大家有问题评论交流 (* ^ ω ^)

一、STM32G4 电机外设篇(四)DAC输出电流波形 + CAN通讯

1 DAC输出电流波形

  • 电机控制环路主要涉及的外设功能包含高级定时器TIM1的发波,OPAMP 及 ADC 准确的采样三相电流,并在三相电流过流时及时封波,避免损坏硬件
  • 本文将会使用STM32G4内部 TIM1ADCCOMP DAC级联使用
1.1 STM32CubeMX配置和Keil代码
  • 配置 DAC1_CH1 为输出模式,只连接外部 Pin,配置外部 Pin为 PA4,使能
    buffer 模式
    在这里插入图片描述* 点击生成代码
  • 在Keil修改代码如下
/* USER CODE BEGIN PV */ 中增加
uint32_t DAC_wave[100] = { 0x0800, 0x0881, 0x0901, 0x0980, 0x09FD, 0x0A79, 0x0AF2, 0x0B68, 0x0BDA, 0x0C49,0x0CB3, 0x0D19, 0x0D79, 0x0DD4, 0x0E29, 0x0E78, 0x0EC0, 0x0F02, 0x0F3C, 0x0F6F,0x0F9B, 0x0FBF, 0x0FDB, 0x0FEF, 0x0FFB, 0x0FFF, 0x0FFB, 0x0FEF, 0x0FDB, 0x0FBF,0x0F9B, 0x0F6F, 0x0F3C, 0x0F02, 0x0EC0, 0x0E78, 0x0E29, 0x0DD4, 0x0D79, 0x0D19,0x0CB3, 0x0C49, 0x0BDA, 0x0B68, 0x0AF2, 0x0A79, 0x09FD, 0x0980, 0x0901, 0x0881,0x0800, 0x077F, 0x06FF, 0x0680, 0x0603, 0x0587, 0x050E, 0x0498, 0x0426, 0x03B7,0x034D, 0x02E7, 0x0287, 0x022C, 0x01D7, 0x0188, 0x0140, 0x00FE, 0x00C4, 0x0091,0x0065, 0x0041, 0x0025, 0x0011, 0x0005, 0x0001, 0x0005, 0x0011, 0x0025, 0x0041,0x0065, 0x0091, 0x00C4, 0x00FE, 0x0140, 0x0188, 0x01D7, 0x022C, 0x0287, 0x02E7,0x034D, 0x03B7, 0x0426, 0x0498, 0x050E, 0x0587, 0x0603, 0x0680, 0x06FF, 0x077F
};/* Initialize all configured peripherals */ 中增加,来启动DAC1通道1
HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);//中断处理函数中增加,来输出DAC的波形
i++;	
if(i>=100)
{i = 0;
}
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_wave[i]);
  • 编译并下载程序
1.2 实验现象

使用逻辑分析仪或者示波器链接逻辑分析仪,查看上传波形
在这里插入图片描述

2 CAN/CANFD通讯

  • 本章介绍使用STM32CUBEMX建立CAN通讯,由于CAN通讯自身的特点,在电机控制的场景中使用非常常见,了解CAN通讯非常有必要
2.1 STM32CubeMX配置和Keil代码
  • 首先配置cubeMx程序,在上一章的基础上使能CAN外设
    在这里插入图片描述
  • 配置仲裁段和数据段的分频系数跳转位宽,使能FIFO模式
  • 波特率:500k = 160M/20/(1+10+5)
  • 使能中断,生成代码
  • 打开Keil,main函数中的部分代码的修改如下
1. 定义RX和TX数据以及中间变量
/* USER CODE BEGIN PV */ 
//CAN收发
FDCAN_RxHeaderTypeDef RxHeader;
FDCAN_TxHeaderTypeDef TxHeader;
uint8_t RxData[8] = {NULL};
uint8_t TxData[8] = {NULL};
float CANtemp[1];2. 声明函数
/* USER CODE BEGIN PFP */ 
void FDCAN2_Config(void);
/* USER CODE END PFP */3. 配置RX和TX数据帧类型,RX接受的ID范围,TX的ID和和数据长度等参数
/* USER CODE BEGIN 4 */ 
void FDCAN2_Config(void)
{FDCAN_FilterTypeDef sFilterConfig;HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);sFilterConfig.IdType = FDCAN_EXTENDED_ID;sFilterConfig.FilterIndex = 0;sFilterConfig.FilterType = FDCAN_FILTER_RANGE;sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID1 = 0x00000000;sFilterConfig.FilterID2 = 0x01ffffff;HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);TxHeader.Identifier = 0x1B;TxHeader.IdType = FDCAN_EXTENDED_ID;TxHeader.TxFrameType = FDCAN_DATA_FRAME;TxHeader.DataLength = FDCAN_DLC_BYTES_8;TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;TxHeader.BitRateSwitch = FDCAN_BRS_OFF;TxHeader.FDFormat = FDCAN_CLASSIC_CAN;TxHeader.TxEventFifoControl= FDCAN_NO_TX_EVENTS;TxHeader.MessageMarker = 0x52;HAL_FDCAN_Start(&hfdcan1);
}4.while循环中将VDC电压上传至上位机
/* USER CODE BEGIN WHILE */
while(1)
{HAL_ADC_Start(&hadc1);HAL_ADC_Start(&hadc2);temp[3] = HAL_ADC_GetValue(&hadc1);temp[3] = temp[3] * 3.3f/4096*26;temp[4] = HAL_ADC_GetValue(&hadc2);temp[4] = temp[4] * 3.3f/4096*26;CANtemp[0] = temp[4];memcpy(TxData,(uint8_t*)&CANtemp, sizeof(CANtemp));HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData);HAL_Delay(10);
}
/* USER CODE END WHILE */5. 在it.c文件中,在FDCAN中断里面,接收上位机发送的数据
/* USER CODE BEGIN EV */
extern FDCAN_HandleTypeDef hfdcanl;
extern FDCAN_RxHeaderTypeDef RxHeader;
extern uint8_t RxData[8];
/* USER CODE END EV */void FDCAN1_IT0_IRQHandler(void)
{/* USER CODE BEGIN FDCAN1_IT0_IRQn 0 *//* USER CODE END FDCAN1_IT0_IRQn 0 */HAL_FDCAN_IRQHandler(&hfdcan1);/* USER CODE BEGIN FDCAN1_IT0_IRQn 1 */HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &RxHeader, RxData);/* USER CODE END FDCAN1_IT0_IRQn 1 */
}
  • 编译并下载代码
2.2 实验现象
  • 接线图
    在这里插入图片描述

  • 打开PCAN上位机,选择500k波特率,点击OK
    在这里插入图片描述

  • 可以看到接受的数据帧ID与MCU中设置一样,上传的VDC电压实时刷新
    在这里插入图片描述

  • 点击下发数据,可以在Keil的Debug中查看接受的数据
    在这里插入图片描述

附学习参考网址

  1. STM32G4 FOC开发实战

欢迎大家有问题评论交流 (* ^ ω ^)


http://www.hkcw.cn/article/iUDixZaegc.shtml

相关文章

电子电气架构 --- 后轮转向的一点事情

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从&#x…

web复习(四)

盒子模型的例题 例一&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>咖啡店banner</title> <style type"text/css"> /*将页面中所有元素的内外边距设置为0*/ *{ padding:0; margin…

Cesium添加点线面(贴地)

// 创建一个图元集合const primitives viewer.scene.primitives.add(new Cesium.PrimitiveCollection());1、点上图 // 定义点的位置&#xff08;中国不同城市的经纬度&#xff09;const points [{ lon: 116.4074, lat: 39.9042, name: "北京" },{ lon: 121.4737, …

技术文档:MD520系列变频器配套杭州干扰净GRJ9000S系列EMC电源滤波器安装指南

1. 引言 MD520系列通用变频器是汇川技术有限公司&#xff08;Inovance&#xff09;设计的高性能电流矢量控制交流驱动器&#xff0c;广泛应用于纺织、造纸、机床、包装、食品、风机和水泵等行业。为确保其在复杂电磁环境中稳定运行并不对其他设备造成干扰&#xff0c;手册推荐…

【基于阿里云搭建数据仓库(离线)】DataWorks中删除节点

1.右击想要删除的节点&#xff0c;点击删除 2. 显示如下界面&#xff0c;点击“去下线” 3.进入到如下界面&#xff0c;点击红色框出来的 4.重新右击想要删除的目标节点&#xff0c;点击删除 5. 点击去下线 6.点击开始下线 7.点击“确认发布” 8.点击“确认” 9.点击“重新删除…

【GESP真题解析】第 6 集 GESP 三级 2023 年 9 月编程题 1:小杨的储蓄

大家好,我是莫小特。 这篇文章给大家分享 GESP 三级 2023 年 9 月编程题第 1 题:小杨的储蓄。 题目链接 洛谷链接:B3867 小杨的储蓄 一、完成输入 根据输入格式的描述,输入有两行,第一行为两个整数 N 和 D,数据范围: 1 ≤ N ≤ 1000 1\le N \le 1000 1≤N≤1000, 1 …

MySQL-多表关系、多表查询

一. 一对多(多对一) 1. 例如&#xff1b;一个部门下有多个员工 在数据库表中多的一方(员工表)、添加字段&#xff0c;来关联一的一方(部门表)的主键 二. 外键约束 1.如将部门表的部门直接删除&#xff0c;然而员工表还存在其部门下的员工&#xff0c;出现了数据的不一致问题&am…

Arbitrum Stylus 合约实战 :Rust 实现 ERC721

在上一篇中&#xff0c;我们学习了如何在 stylus 使用 rust 编写 ERC20合约&#xff0c;并且部署到了Arbitrum Sepolia &#xff0c;今天我们继续学习&#xff0c;如何在 stylus 中使用 rust 实现 ERC721 合约&#xff0c;OK, 直接开干&#xff01; 关于环境准备&#xff0c;请…

超声波测距三大算法实测对比

前言 声波测距的数据包含很大噪声&#xff0c;即使障碍物&#xff08;以纸板为例&#xff09;静止&#xff0c;测量距离数据也上下跳变&#xff0c;需要通过数据滤波算法降低测量误差&#xff0c;主要滤波算法有平均值滤波和卡尔曼滤波。 在超声波测距中&#xff0c;无滤波、…

【2025年5月】AI生产力再探再报:各家智能体持续内卷,前沿应用不断细分

前言 2025年5月的个人学习笔记。 一、工具尝鲜快报&#xff1a;初探感觉好玩&#xff0c;但还未深入的工具。 二、生产力军火库&#xff1a;开箱即用的神器&#xff0c;以及一些好用的技巧。 三、前沿动态速递&#xff1a;一些可反复品读的优质资料和个人感兴趣的新工具。 文章…

ubuntu22.04安装megaton

前置 sudo apt-get install git cmake ninja-build generate-ninja安装devkitPro https://blog.csdn.net/qq_39942341/article/details/148388639?spm1001.2014.3001.5502 安装cargo https://blog.csdn.net/qq_39942341/article/details/148387783?spm1001.2014.3001.5501 …

shell脚本的条件测试

命令结果判定 && &#xff1a;在命令执行后如果没有任何报错时会执行符号后面的动作 || &#xff1a;在命令执行后如果命令有报错会执行符号后的动作 条件判断 # test 语句 # []&#xff0c;[[]]&#xff0c;(()) 语句 # [[]] 可以支持的表达式更多&#xff0c;是最常…

已有的前端项目打包到tauri运行(windows)

1.打包前端项目产生静态html、css、js 我们接下来用vue3 vite编写一个番茄钟案例来演示。 我们执行npm run build 命令产生的dist目录下的静态文件。 2.创建tarui项目 npm create tauri-applatest一路回车&#xff0c;直到出现。 3.启动运行 我们将打包产生的dist目录下的…

随记 nacos + openfegin 的远程调用找不到服务

这里的配置问题就不说了&#xff0c;基本的都没有问题&#xff0c;然后现在的是怎么样的场景呢&#xff0c;就是有两台服务器&#xff0c;两台服务器分别部署了两个模块&#xff0c;B要调用A服务&#xff0c;然后通过nacos找到了这个服务的名称&#xff0c;但是呢发现连不上&am…

【Python 算法零基础 4.排序 ⑦ 桶排序】

草木不争高&#xff0c;争的是生生不息 —— 25.5.26 选择排序回顾 ① 遍历数组&#xff1a;从索引 0 到 n-1&#xff08;n 为数组长度&#xff09;。 ② 每轮确定最小值&#xff1a;假设当前索引 i 为最小值索引 min_index。从 i1 到 n-1 遍历&#xff0c;若找到更小元素&am…

天机学堂-分页查询

需求 分页查询我的课表 返回&#xff1a; 总条数、总页数、当前页的课表信息的集合 返回的VO&#xff08;已经封装成统一的LearningLessonsVO&#xff09; 定义Controller RestController RequestMapping("/lessons") RequiredArgsConstructor public class Lear…

Transformer 是未来的技术吗?

之前的文章中&#xff0c;聊了不少关于 Transformer 方面的内容&#xff1a; Transformer 中的注意力机制很优秀吗&#xff1f;-CSDN博客初探 Transformer-CSDN博客来聊聊Q、K、V的计算-CSDN博客 现在的大模型基本都是基于 Transformer 或者它的演进技术&#xff0c;那么&…

阿里云国际站,如何通过代理商邀请的链接注册账号

阿里云国际站&#xff1a;如何通过代理商邀请链接注册&#xff0c;解锁“云端超能力”与专属福利&#xff1f; 渴望在全球化浪潮中抢占先机&#xff1f;想获得阿里云国际站的海量云资源、遍布全球的加速节点与前沿AI服务&#xff0c;同时又能享受专属折扣、VIP级增值服务支持或…

[创业之路-404]:企业战略管理案例分析-战略执行-人才战略

一、概述 在BLM&#xff08;业务领先模型&#xff09;战略执行中&#xff0c;人才是核心模块和关键要素&#xff0c;其管理需紧密围绕战略目标展开&#xff0c;具体如下&#xff1a; 1. 人才战略与战略目标的对齐 关键任务分解&#xff1a;通过战略解码&#xff0c;将业务目…

C++11 : 智能指针

C11 &#xff1a; 智能指针 目录 C11 &#xff1a; 智能指针引言1. 智能指针的使用场景分析2. RALL和智能指针的设计思路3. C标准库智能指针的使用4. 智能指针的原理5. shared_ptr和weak_ptr5.1 shared_ptr循环引用问题5.2 weak_ptr 6. shared_ptr的线程安全问题7. C11和boost中…