STM32G4 TIM1触发ADC转换

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.rhkb.cn/news/288556.html

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

相关文章

T1 神奇苹果桶 (25分) - 小米前端笔试编程题解

考试平台: 赛码 题目类型: 20道选择 2道编程题 考试时间: 2024-03-23 (两小时) 题目描述 小希在森林冒险的时候发现一个神奇的木桶,某些时会凭空出现一些苹果,小希很解地大家分享了这一个神奇…

【Flutter 面试题】 如何在Flutter中进行网络请求?

【Flutter 面试题】 如何在Flutter中进行网络请求? 文章目录 写在前面口述回答补充说明实际案例步骤 1: 添加 http 包依赖步骤 2: 创建一个简单的 UI 来展示帖子步骤 3: 发起网络请求获取帖子运行结果详细说明 写在前面 🙋 关于我 ,小雨青年…

如何使用Python结合Pillow、matplotlib和OpenCV实现图片读取

使用Pillow库 matplotlib是一个绘图库,经常用于数据可视化,但它也可以用来展示图片。 from PIL import Image# 读取图片 image Image.open(.jpg)# 展示图片 image.show()使用OpenCV库 OpenCV是一个强大的计算机视觉和机器学习库。它不仅提供了大量的图像…

【Selenium】隐藏元素的定位和操作|隐藏与isDisplay方法

一、selenium 中隐藏元素如何定位? 如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~能定位到并不意味着能操作元素(如click,clear,send_keys) 二、隐藏元素 如下图有个输入框…

Android卡顿掉帧问题分析之实战篇

本文将结合典型实战案例,分析常见的造成卡顿等性能问题的原因。从系统工程师的总体角度来看 ,造成卡顿等性能问题的原因总体上大致分为三个大类:一类是流程执行异常;二是系统负载异常;三是编译问题引起。 1 流程执行异…

是德科技keysight 81624B功率传感器

181/2461/8938产品概述: 这个功率探头配有经过散热的 5mm 铟砷化镓(InGaAs)检波器,在 800-1700 nm 波长范围内的测量准确度更高。 特点 关键性能技术指标 低偏振相关性:0.002 dB 低频谱纹波不确定度:0.002…

网络链路层之(2)PPP协议

网络链路层之(2)PPP协议 Author: Once Day Date: 2024年3月27日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CSDN…

MAC使用Clion开发STM32

安装软件 CLion :略 STM32CubeMX:略 brew : /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"openocd : brew install open-ocd # 以下命令有输出说明安装成功 openocd -…

开源大数据集群部署(十八)Hive 安装部署

作者:櫰木 1 创建hive Kerberos主体 bash /root/bigdata/getkeytabs.sh /etc/security/keytab/hive.keytab hive2 安装 在hd1.dtstack.com主机root权限下操作: 解压包 [roothd3.dtstack.com software]# tar -zxvf apache-hive-3.1.2-bin.tar.gz -C …

快速上手Spring Cloud 十:Spring Cloud与微前端

快速上手Spring Cloud 一:Spring Cloud 简介 快速上手Spring Cloud 二:核心组件解析 快速上手Spring Cloud 三:API网关深入探索与实战应用 快速上手Spring Cloud 四:微服务治理与安全 快速上手Spring Cloud 五:Spring …

Web3:探索区块链与物联网的融合

引言 随着科技的不断发展,区块链技术和物联网技术都成为了近年来备受瞩目的前沿技术。而当这两者结合在一起,将产生怎样的化学反应呢?本文将深入探讨Web3时代中区块链与物联网的融合,探索其意义、应用场景以及未来发展趋势。 1. …

[flask]异常抛出和捕获异常

Python学习之Flask全局异常处理流程_flask 异常处理-CSDN博客 读取文件错误 OSError: [Errno 22] Invalid argument:_[errno 22] invalid argument: ..\\data\\snli_1.0\\-CSDN博客 异常触发 assert触发异常: 在Python中,使用assert语句可以检查某个条…

Django 中间件

【一】Django框架之生命周期流程图 【二】介绍 【1】概述 Django 中的中间件(Middleware)是一个轻量级、底层的“插件”系统,用来全局地改变 Django 的输入或输出。每个中间件组件负责处理特定的全局任务,例如处理会话、处理跨站…

电脑访问网页获取路由器WAN口内网IP

因为运维过程中容易出现路由器配置了固定IP但是没人知道后台密码,不确定这个办公室的IP地址,且使用tracert路由追踪也只会出现路由器的LAN口网关并不会出现WAN口IP。 今日正好遇到了个好方法,经过测试可以正常使用。 方法如下: 内…

2.2 添加商户缓存

实战篇Redis 2.2 添加商户缓存 在我们查询商户信息时,我们是直接操作从数据库中去进行查询的,大致逻辑是这样,直接查询数据库那肯定慢咯,所以我们需要增加缓存 GetMapping("/{id}") public Result queryShopById(Pat…

ASP.Net添加Swagger注释

文章目录 Swagger添加Swagger注释 Swagger 添加Swagger注释 1、右击项目->选择属性->点击生成->输出,选中文档文件 2、配置服务 在program.cs 文件里配置SwaggerUI //增加项一 builder.Services.AddSwaggerGen(c> {c.SwaggerDoc("v1", ne…

免费SSL证书和付费SSL证书的区别点

背景: 在了解免费SSL证书和付费SSL证书的区别之前,先带大家了解一下SSL证书的概念和作用。 SSL证书的概念: SSL证书就是基于http超文本传输协议的延伸,在http访问的基础上增加了一个文本传输加密的协议,由于http是明…

外星人m18R2国行中文版原厂预装23H2原装Win11系统恢复带F12恢复重置

戴尔外星人m18R2国行中文版原厂预装23H2系统恢复安装 远程恢复安装:https://pan.baidu.com/s/166gtt2okmMmuPUL1Fo3Gpg?pwdm64f 提取码:m64f 1.自带原厂预装系统各驱动,主题,Logo,Office带所有Alienware主题壁纸、Alienware软件驱动 2.带…

Redis高级面试题-2024

说说你对Redis的理解 Redis是一个基于Key-Value存储结构的开源内存数据库,也是一种NoSQL数据库。 它支持多种数据类型,包括String、Map、Set、ZSet和List,以满足不同应用场景的需求。 Redis以内存存储和优化的数据结构为基础,提…

前端框架的简单介绍

html html-结构 盖房子之前先划三室二厅 (超文本标记语言)(可以实现一切的文本) css css-样式 在房里添家具 (层叠样式单)(化妆在脸上叠加) javascript(js) javascript(js)-交互(行为) 我点击你打开 供显示信息的元…