stm32如何接收舵机的控制信号(而不是控制舵机)

news2024/11/25 1:29:09

看到很多如何stm32用pwm信号控制舵机的文章,老生常谈了
我来写一个stm32接收pwm信号的例子 ,这个pwm信号是用来控制舵机的

背景:

我需要接收航模接收机的,用来控制舵机的pwm信号, 得到这个信号后,做其他事情.

初版代码

pwm.h

#ifndef _pwm_H
#define _pwm_H

#include "system.h"

extern uint16_t  IC2Value;
extern float  DutyCycle;
extern float  Frequency;

void pwmIC_Init();

#endif

pwm.c

#include "pwm.h"
#include "usart.h"
#include "stm32f10x_gpio.h"

/**
me totally new 
**/
void pwmIC_Init()
{
	
		GPIO_InitTypeDef GPIO_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		TIM_ICInitTypeDef TIM_ICInitStructure;  

		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 
		TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
		TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
		TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
		TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
		TIM_ICInitStructure.TIM_ICFilter = 0x0;
 
		TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
 
		TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
 
		TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
 
		TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
 
		TIM_Cmd(TIM3, ENABLE);
 
		TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
 
		NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
 
}


// https://blog.csdn.net/qq_37389133/article/details/79772878
/*
这里最关键的就是TIM_ICPolarity_Rising 为上升沿开始捕获,TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
选择IC2为有效的输入端,就是IC2获得的就是周期了,而IC1就是在这里就是高电平的时间! 假设周期:600,高电平时间:300
可以计算的得到占空比  = 300/600, 可以得到频率 =72M/ 600
*/
void TIM3_IRQHandler(void)
{
 
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
 
	//ic2是周期
  IC2Value = TIM_GetCapture2(TIM3);
 
  if (IC2Value != 0)
  {
		//TIM_GetCapture1(TIM3)是高电平的时间,除以周期得到占空比
    DutyCycle = (TIM_GetCapture1(TIM3) * 100) / IC2Value; 
    Frequency = SystemCoreClock / IC2Value;
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}

代码参考了:

https://blog.csdn.net/qq_37389133/article/details/79772878

代码是可以用的,
只需要在main.c里引用pwm.h然后定义extern变量 然后在初始化的地方执行pwmIC_Init(); 之后就可以用这几个变量了

但问题是:

在这里插入图片描述
dutycycle到101左右之后就又从零开始了.
跟踪到TIM_GetCapture1(TIM3) ,发现他到65xxx就开始变成0 , 查询了下返回类型是uint16_t

问AI

在这里插入图片描述
ai说%d虽然也可以但最好用%u, 还说了最大6xxxx,所以是我们的上升沿的计数超过了这个库函数的最大值,所以从0开始了. 咋办呢咋办呢,哦对了

问AI

在这里插入图片描述
ai告诉我可以配置定时器TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure.
我配了, 效果
在这里插入图片描述
是满足了我的需要的

真棒
原来我痛苦于低级语言的低级,现在我在AI的帮助下得心应手.

init的完整代码:


void pwmIC_Init()
{
	
		GPIO_InitTypeDef GPIO_InitStructure;
		NVIC_InitTypeDef NVIC_InitStructure;
		TIM_ICInitTypeDef TIM_ICInitStructure;  
		TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	
 
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 
	//start
    // 启用定时器时钟
    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    
    // 配置定时器基本参数
    //TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 设置自动重装载寄存器为最大值
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 设置预分频器为72-1
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 设置时钟分频因子为1
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	//end
	
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 
		TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
		TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
		TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
		TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
		TIM_ICInitStructure.TIM_ICFilter = 0x0;
 
		TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
 
		TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);
 
		TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
 
		TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
 
		TIM_Cmd(TIM3, ENABLE);
 
		TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
 
		NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
 
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman之pm.test断言操作

系列文章目录 1.Postman之安装及汉化基本使用介绍 2.Postman之变量操作 3.Postman之数据提取 4.Postman之pm.test断言操作 5.Postman之newman Postman之pm.test断言操作 1.断言方法2.连接符3.条件判断符 用于验证请求的响应数据是否符合预期 1.断言方法 pm.test():…

MySQL面试题补

内连接和外连接的区别: ○1.功能和用法不同:内连接是连接两表都满足情况的数据;而外连接是以一边的表为主表,另一个表只显示匹配的行; ○2.用途:内连接一般是用于检索不同表需要根据共同的列值进行匹配的&a…

查看浏览器的请求头

爬虫时用到了请求头,虽然可以用网上公开的,但是还是想了解一下本机浏览器的。以 Edge 为例,其余浏览器通用。 打开浏览器任一网页,按F12打开DevTools;或鼠标右键,选择“检查”。首次打开界面应该显示在网页…

小R的二叉树探险 | 模拟

问题描述 在一个神奇的二叉树中,结构非常独特: 每层的节点值赋值方向是交替的,第一层从左到右,第二层从右到左,以此类推,且该二叉树有无穷多层。 小R对这个二叉树充满了好奇,她想知道&#xf…

蓝牙定位|三维空间情况下的仿真例程(四个蓝牙基站的情况,附源代码)MATLAB程序

这段代码通过RSSI信号强度实现了在三维空间中的蓝牙定位,展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。代码涉及信号衰减模型、距离计算和最小二乘法估计等基本概念,并通过三维可视化展示了真实位置与估计位置的关系。 文章目录 蓝牙定位…

Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计

概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术,选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发,搭载了先进的勘智 K230D 芯片。 K230…

Django+Nginx+uwsgi网站使用Channels+redis+daphne实现简单的多人在线聊天及消息存储功能

网站部署在华为云服务器上,Debian系统,使用DjangoNginxuwsgi搭建。最终效果如下图所示。 一、响应逻辑顺序 1. 聊天页面请求 客户端请求/chat/(输入聊天室房间号界面)和/chat/room_name(某个聊天室页面)链…

TransFormer--整合编码器和解码器

TransFormer--整合编码器和解码器 下图完整地展示了带有编码器和解码器的Transformer架构。 在图中,N表示可以堆叠N个编码器和解码器。我们可以看到,一旦输入句子(原句),编码器就会学习其特征并将特征发送给解码器&…

短视频矩阵矩阵,矩阵号策略

随着数字媒体的迅猛发展,短视频平台已经成为企业和个人品牌推广的核心渠道。在这一背景下,短视频矩阵营销策略应运而生,它通过高效整合和管理多个短视频账号,实现资源的最优配置和营销效果的最大化。本文旨在深入探讨短视频矩阵的…

Apple Vision Pro开发002-新建项目配置

一、新建项目 可以选择默认的,也可以选择Universal 3D 二、切换打包平台 注意选择Target SDK为Devices SDk,这种适配打包到真机调试 三、升级新的Input系统 打开ProjectSettings,替换完毕之后引擎会重启 四、导入PolySpatial 修改上图红…

【StarRocks】starrocks 3.2.12 【share-nothing】 多Be集群容器化部署

文章目录 一. 集群规划二.docker compose以及启动脚本卷映射对于网络环境变量 三. 集群测试用户新建、赋权、库表初始化断电重启扩容 BE 集群 一. 集群规划 部署文档 https://docs.starrocks.io/zh/docs/2.5/deployment/plan_cluster/ 分类描述FE节点1. 主要负责元数据管理、…

LLaMA-Factory 上手即用教程

LLaMA-Factory 是一个高效的大型语言模型微调工具,支持多种模型和训练方法,包括预训练、监督微调、强化学习等,同时提供量化技术和实验监控,旨在提高训练速度和模型性能。 官方开源地址:https://github.com/hiyouga/L…

Java基础面试题01-请描述Java中JDK和JRE的区别?

什么是 JDK? JDK 全称 Java Development Kit,中文叫“Java 开发工具包”。 它是给 Java 开发者用的工具箱,里面有一切写代码、编译代码、调试代码所需要的工具。 JDK 包括什么? Java 编译器(javac)&…

Ubuntu20.04下安装向日葵

向日葵远程控制app官方下载 - 贝锐向日葵官网 下载Ununtu版的图形版本的安装deb包SunloginClient_15.2.0.63064_amd64.deb 直接执行 sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 的话会报错: 如果在Ubuntu20.04里直接执行sudo apt install libgconf-2-4安装libgco…

Typora+PicGo+云服务器搭建博客图床

文章目录 前言一. 为什么要搭建博客图床?1.1 什么是图床?1.2 为什么要搭建博客图床? 二. 安装软件三. 配置阿里云OSS3.1 注册,开通对象储存3.2 创建bucket3.3 找到你的地域节点3.4 accessKeyId和accessKeySecret3.5 给你的阿里云账户充值 四. 配置4.1 配…

Python的3D可视化库 - vedo (2)visual子模块 基本可视化行为

文章目录 1. visual模块的继承关系2. 基类CommonVisual的方法2.1 获取对象信息2.1.1 对象本身信息2.1.2 对象的查找表2.1.3 对象标量范围2.1.4 对象缩略图 2.2 呈现对象2.2.1 在窗口显示1.2.2 对象可见性 2.2.3 对象颜色2.2.4 对象透明度 2.3 添加标度条2.3.1 2D标度条2.3.2 3D…

常用Rust日志处理工具教程

在本文中,我想讨论Rust中的日志。通过一些背景信息,我将带您了解两个日志库:env_logger和log4rs。最后,我将分享我的建议和github的片段。 Rust log介绍 log包是Rust中日志API的事实标准,共有五个日志级别&#xff1…

废品买卖回收管理系统|Java|SSM|Vue| 前后端分离

【重要①】前后端源码万字文档部署文档 【重要②】正版源码有问题包售后 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可以提供远程部署安装,包扩环境 【…

案例研究|阿特斯的JumpServer分布式部署和多组织管理实践

苏州阿特斯阳光电力科技有限公司(以下简称为阿特斯)是一家集太阳能光伏组件制造和为全球客户提供太阳能应用产品研发、设计、制造、销售的专业公司。 阿特斯集团总部位于加拿大,中国区总部位于江苏省苏州市。通过全球战略和多元化的市场布局…

tongweb安全整改

一 禁止以root账号运行tongweb服务 1 如果是首次安装须创建普通用户安装tongweb 2 如果已经使用root账号安装了tongweb 2.1 创建普通用户 2.2 使用root账号授予tongweb安装目录宿主权限为普通用户 2.3赋权成功后,后续启动tongweb服务必须为普通用户 二 tongRDS隐…