STM32G4 TIM1触发ADC转换

news/2024/5/9 2:38:44/文章来源:https://blog.csdn.net/weixin_42880082/article/details/137080426

STM32G4 TIM1触发ADC转换


  • 📍相关篇《HAL STM32G4 +ADC手动触发采集+各种滤波算法实现》
  • 🎈《HAL STM32G4 +TIM1 3路PWM互补输出+VOFA波形演示》
  • 📍《HAL STM32G4内部运放的使用》
  • ✨继欧拉电子无刷电机驱动相关视频学习 – STM32G4 FOC开发实战—TIM1 ADC COMP DAC级联

STM32G4 FOC开发实战—TIM1 ADC COMP DAC级联

  • 🌿相对应的文章:https://mp.weixin.qq.com/s?__biz=MzkwMDIzNjA1MQ==&mid=2247484140&idx=1&sn=38128f6f5f8b7afc35a9dd191a4718a8&chksm=c0465490f731dd864907d18ec837e37801062578ac0971eed810268a2efccece02990606e874&mpshare=1&scene=23&srcid=03247g3pxdbfnU0CUA8vrM2i&sharer_shareinfo=411eecf8ebc86fc522cf982bb036e8b0&sharer_shareinfo_first=411eecf8ebc86fc522cf982bb036e8b0#rd

✨跟着视频学习过程中,还是出现了不少状况,在实际测试过程中,发现测试结果并不如视频效果预期。于是各种检查和找问题。

  • 📌与本篇知识相关内容参考:《手把手移植 simpleFOC (五):电流检测 篇》
  • 🧨《手写STM32 FOC记录-----pwm触发adc电流采样》
  • 🔖在以上参考内容中,解决了不能进入ADC中断的问题。

⛳注意事项

  • 🌿在上面的视频讲解和文章内容中,没有提及在STM32CubeMX软件中对ADC中断的开启。
  • 🌿ADC注入转换,需要开启对应的中断。具体参考下面main代码初始化配置。

📙本篇工程功能实现概要

  • 🌾STM32G4高级定时器1(TIM1)产生3路互补PWM。:PWM互补输出通过调整PWM信号的占空比来控制电机的转速,通过改变信号的极性来控制电机的转向,从而实现精确的电机控制。
  • 🌾利用高级定时器1(TIM1)通道4,触发ADC采样。
  • 🌾使能ADC1注入通道:ADC1 ->AIN3、ADC1 -> AIN11
  • 🌾使能ADC2注入通道:ADC2 ->AIN1
  • 配合内部的OPAMP,ADC准确的采样三相电流。
  • 🌾使能DAC3 OUT1输出,映射到芯片内部外设。
  • 在三相电流过流时及时封波.
  • TIM1通道4触发ADC注入转换测试:
    在这里插入图片描述

🛠代码配置

  • 📝main
int main(void)
{/* USER CODE BEGIN 1 */
//     float temp[5];
//	uint8_t TempData[12];//16  ADC:12;PWM:16 OPM:24/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_TIM1_Init();MX_USART1_UART_Init();MX_ADC1_Init();MX_COMP1_Init();MX_DAC3_Init();MX_ADC2_Init();MX_OPAMP1_Init();MX_OPAMP2_Init();MX_OPAMP3_Init();/* USER CODE BEGIN 2 *///	TIM1->PSC = 30000;//VOFA上位机观测,开启//	TIM1->ARR = 10000;//    TIM1->CCR1 = 2000;
//    TIM1->CCR2 = 5000;
//    TIM1->CCR3 = 4000;HAL_TIM_Base_Start(&htim1);//	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);//	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);//	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);//	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);//	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);HAL_OPAMP_Start(&hopamp1);HAL_OPAMP_Start(&hopamp2);HAL_OPAMP_Start(&hopamp3);//HAL_UART_Receive_IT(&huart3,(uint8_t *)&aRxBuffer,1);HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);//ADC自校验HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);TIM1->ARR = 8000 - 1;TIM1->CCR4 = 8000 - 2;//PWM_F=160MHz/(8000*2)=10KHzHAL_TIM_Base_Start(&htim1);HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);//用于产生ADC触发事件__HAL_ADC_ENABLE_IT(&hadc1, ADC_IT_JEOC);//需要开启ADC注入中断__HAL_ADC_ENABLE_IT(&hadc2, ADC_IT_JEOC);HAL_ADCEx_InjectedStart_IT(&hadc1);HAL_ADCEx_InjectedStart(&hadc2);HAL_DAC_Start(&hdac3, DAC_CHANNEL_1);HAL_DAC_SetValue(&hdac3, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 3000);HAL_COMP_Start(&hcomp1);//启动比较器/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1) {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_ADC_Start(&hadc1);HAL_ADC_Start(&hadc2);Vpoten = HAL_ADC_GetValue(&hadc1);adc_vbus = HAL_ADC_GetValue(&hadc2);Vbus = adc_vbus * 3.3f / 4096 * 26;HAL_Delay(10);}/* USER CODE END 3 */
}
  • 🌿按键中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{/*Preventunusedargument(s)compilationwarning */// UNUSED(GPIO_Pin);if(KEY1_Pin == GPIO_Pin) {HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);}// if(KEY2_Pin == GPI0_Pin)//没有配置该按键//	{// HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);// HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);// HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);// HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1);// HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);// HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);//	}
}
  • 🌿ADC注入中断回调
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc)
{static uint8_t cnt;/*Preventunused argument(s)compilation warning */
//     UNUSED(hadc);if(hadc == &hadc1) {if(ADC_offset == 0) {cnt++;adc1_in1 = hadc1.Instance->JDR1;adc1_in2 = hadc2.Instance->JDR1;adc1_in3 = hadc1.Instance->JDR2;IA_Offset += adc1_in1;IB_Offset += adc1_in2;IC_Offset += adc1_in3;}if(cnt >= 10) {ADC_offset = 1;IA_Offset = IA_Offset / 10;IB_Offset = IB_Offset / 10;IC_Offset = IC_Offset / 10;}} else {HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);adc1_in1 = hadc1.Instance->JDR1;Ia = (adc1_in1 - IA_Offset) * 0.0193359375f;adc1_in2 = hadc2.Instance->JDR1;Ib = (adc1_in2 - IB_Offset) * 0.0193359375f;adc1_in3 = hadc1.Instance->JDR2;Ic = (adc1_in3 - IC_Offset) * 0.0193359375f;TIM1->CCR1 = 2000;TIM1->CCR2 = 4000;TIM1->CCR3 = 6000;load_data[0] = Ia;load_data[1] = Ib;load_data[2] = Ic;load_data[3] = 0;load_data[4] = 0;
//        memcpy(tempData, (uint8_t *)&load_data, sizeof(load_data));
//        HAL_UART_Transmit_DMA(&huart1, (uint8_t *)tempData, 6 * 4);}
}

📚测试工程源码

链接:https://pan.baidu.com/s/1eWC-KZDSMnUfOTAn-wMgmg?pwd=s50q 
提取码:s50q

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026132.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins+newman+postman持续集成环境搭建

一、Newman简介 Newman是一款基于Node.js开发的,可以运用postman工具直接从命令运行和测试postman集合 二、Newman应用 环境准备:js/ cnpm或npm配置好环境,执行如下命令 三、安装newman 验证是否安装成功,命令:newm…

Ps:照片滤镜

照片滤镜 Photo Filter命令提供了一种快速且直观的方式来模拟传统摄影中使用的彩色滤镜效果。这一功能不仅适用于色彩校正,还可以用于创意色彩调整,以增加视觉吸引力或传达特定的情绪。 Ps菜单:图像/调整/照片滤镜 Adjustments/Photo Filter …

求职MAX版

sangwu 在校-随时到岗 经验:无 本科 20岁 Java开发工程师 全国可飞 薪资可谈 本人优势 不懂劳动法,加班可住公司。稳定性高,不愿意跳槽,能坚守到公司倒闭。各职位都能胜任,性价比高。…

【蓝桥杯选拔赛真题49】C++收集宝石 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C收集宝石 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C收集宝石 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 聪聪在玩冒险岛游戏,为了…

Android JNI SO库和对应的CPU架构详解

Android JNI SO库和对应的CPU架构详解 文章目录 Android JNI SO库和对应的CPU架构详解一、前言二、Android CPU架构1、Android系统支持的CPU架构2、如查查看手机的CPU架构(1)Android13 大屏AML厂商的cpu信息:(2)电脑An…

【Leetcode每日一题】 递归 - 计算布尔二叉树的值(难度⭐⭐)(44)

1. 题目解析 题目链接:2331. 计算布尔二叉树的值 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 算法思路概述: 问题解释:我们面对的是一个节点可能含有逻辑运算符(AN…

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十六)

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十五六) 一、算法介绍二、使用步骤1.代码2.效果一、算法介绍 写论文当然用RANSAC的优化变种算法MSAC啊,RANSAC太土太LOW了哈哈 MSAC算法(M-estimator Sample Consensus)是RANSAC(Random Sample Consensus)的一种…

git笔记之撤销、回退、reset方面的笔记

git笔记之撤销、回退、reset方面的笔记 code review! 文章目录 git笔记之撤销、回退、reset方面的笔记1.git 已经commit了,还没push,如何撤销到初始状态git reset --soft HEAD~1git reset HEAD~1(等同于 git reset --mixed HEAD~1&#xff0…

探索BPMN:业务流程模型与表示法

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【论文速读】| 对大语言模型解决攻击性安全挑战的实证评估

本次分享论文为:An Empirical Evaluation of LLMs for Solving Offensive Security Challenges 基本信息 原文作者:Minghao Shao, Boyuan Chen, Sofija Jancheska, Brendan Dolan-Gavitt, Siddharth Garg, Ramesh Karri, Muhammad Shafique 作者单位&a…

MATLAB机器学习工具箱——傻瓜式操作

一、使用回归学习器预测北京二手房房价 软件:MATLAB R2023 a 数据: 第一步:导入原始数据和待预测数据 第二步 :打开工具箱中的回归学习器导入学习数据 1.新建会话 2.寻找导入learning data 3.自动锁定前7列为自变量&#xff…

【计算机考研】408到底有多难?

你真以为大家是学不会408吗? 不是!单纯是因为时间不够!!! 再准确一些就是不会分配时间 408的知识其实并不难,要说想上130那确实有难度,但是100在时间充裕的情况下还是可以做到的 我本人是双…

数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:数据分析系统化教学,零基础到进阶实战 景天的主页:景天科技苑 文章目录 Streamlit什么是streamli…

[Linux_IMX6ULL驱动开发]-基础驱动

驱动的含义 如何理解嵌入式的驱动呢,我个人认为,驱动就是嵌入式上层应用操控底层硬件的桥梁。因为上层应用是在用户态,是无法直接操控底层的硬件的。我们需要利用系统调用(open、read、write等),进入内核态…

RuleApp资源社区,知识付费社区,可对接typecho的小程序APP

强大的文章/社区/自媒体客户端,支持打包为安卓,苹果,小程序。包括文章模块,用户模块,支付模块,聊天模块,商城模块等基础功能,包含VIP会员,付费阅读等收费体系&#xff0c…

C程序编译、链接与项目构建

C程序编译、链接与项目构建 摘要C编译环境静、动态库介绍gcc与g和程序编译、链接Visual Studio创建和链接库动态库的显示调用Windows下显示动态库的加载/查找方式 Make介绍安装使用 CMake介绍安装使用构建方式内部构建外部构建构建使用静/动态库常用[系统]变量常用指令CMake模块…

PostgreSQL关系型数据库介绍与部署

使用背景 在过去的几年中,PostgreSQL的使用量逐渐增加,而Oracle和MySQL的使用量则有所下降。这主要是由于以下几个原因:开源和免费、功能丰富、可扩展性强、安全性高、跨平台支持好、社区活跃、成熟稳定。这些因素使得PostgreSQL成为了许多开…

2024/3/23打卡数组分割(第14届蓝桥杯)——二项式+快速幂

题目 思路 分析该题,要将集合 划分成两个子集 ,且两个子集的和都是偶数。 可知:偶数 偶数 偶数;偶数 奇数 奇数;奇数 奇数 偶数; 分析可得:如果该集合的和为奇数,就不能分…

八、C#计数排序算法

简介 计数排序是一种非比较性的排序算法,适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数,然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。 创建一个长度为max-min1的数组count…

IP如何异地共享文件?

【天联】 组网由于操作简单、跨平台应用、无网络要求、独创的安全加速方案等原因,被几十万用户广泛应用,解决了各行业客户的远程连接需求。采用穿透技术,简单易用,不需要在硬件设备中端口映射即可实现远程访问。 异地共享文件 在…