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

看到很多如何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);
 
}

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

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

相关文章

Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器

Spring Boot 3.x OAuth 2.0:构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布,我们迎来了许多新特性和改进,其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0&#xf…

Photoshop(PS)——人像磨皮

1.新建一个文件,背景为白色,将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来,选择第一个拷贝图层,选择滤镜---杂色---蒙尘与划痕 3.调整一下数值,大概能够模糊痘印痘坑,点击确定。 4.然后选择拷贝2图层…

Vue3 + Vite 项目引入 Typescript

文章目录 一、TypeScript简介二、TypeScript 开发环境搭建三、编译方式1. 自动编译单个文件2. 自动编译整个项目 四、配置文件1. compilerOptions基本选项严格模式相关选项(启用 strict 后自动包含这些)模块与导入相关选项 2. include 和 excludeinclude…

MySql 索引视图存储变量

要求 一: 学生表:Student(Sno,Sname,Ssex ,Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course(Cno,Cname) 课程号,课程名 Cno为主键 学生…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址(欢迎大家访问):使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在,大模型已经渗透到各行各业,大模型也逐渐趋于平民化;从最开始对其理解、生成、强大的知识积累的惊叹&…

除了电商平台,还有哪些网站适合进行数据爬取?

在数字化时代,数据的价值日益凸显,而网络爬虫技术成为获取数据的重要手段。除了电商平台,还有许多其他类型的网站适合进行数据爬取,以支持市场研究、数据分析、内容聚合等多种应用场景。本文将探讨除了电商平台外,还有…

Linux-第2集-打包压缩 zip、tar WindowsLinux互传

欢迎来到Linux第2集,这一集我会非常详细的说明如何在Linux上进行打包压缩操作,以及解压解包 还有最最重要的压缩包的网络传输 毕竟打包压缩不是目的,把文件最终传到指定位置才是目的 由于打包压缩分开讲没有意义,并且它们俩本来…

tcp 超时计时器

在 TCP(传输控制协议)中有以下四种重要的计时器: 重传计时器(Retransmission Timer) 作用:用于处理数据包丢失的情况。当发送方发送一个数据段后,就会启动重传计时器。如果在计时器超时之前没有…

go环境搭建

华子目录 下载vscode安装vscodego编译器下载go编译器安装配置go环境变量vscode安装go插件测试 下载vscode 官方:https://code.visualstudio.com/Download 安装vscode vscod安装成功 go编译器下载 官方:https://golang.google.cn/ 点击下载 go编译器安…

Minikube 上安装 Argo Workflow

文章目录 步骤 1:启动 Minikube 集群步骤 2:安装Argo Workflow步骤 3:访问UI创建流水线任务参考 前提条件: Minikube:确保你已经安装并启动了 Minikube。 kubectl:确保你已经安装并配置了 kubectl&#xff…

Stable Diffusion核心网络结构——CLIP Text Encoder

🌺系列文章推荐🌺 扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新&…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的,还可以存链表、数组等等复杂数据结构 而且数据是在…

git日志查询和导出

背景 查看git的提交记录并下载 操作 1、找到你idea代码的路径,然后 git bash here打开窗口 2、下载所有的日志记录 git log > commit.log3、下载特定日期范围内记录 git log --since"2024-09-01" --until"2024-11-18" 你的分支 > c…

Go中数组和切片

数组和切片 【1】、数组 1、什么是数组 一组数 数组需要是相同类型的数据的集合 数组是需要定义大小的 数组一旦定义了大小是不可以改变的。 package mainimport "fmt"// 数组 // 数组和其他变量定义没什么区别,唯一的就是这个是一组数,需要…

three.js加载GLTF模型

要在three.js中正确加载和显示GLTF模型,需要遵循一系列步骤来确保模型的纹理和材质被正确应用。以下是加载GLTF模型的基本步骤: 引入必要的three.js模块: 引入了GLTFLoader模块,用来加载GLTF格式模型的类。 创建加载器实例&#…

消息中间件分类

消息中间件(Message Middleware)是一种在分布式系统中实现跨平台、跨应用通信的软件架构。它基于消息传递机制,允许不同系统、不同编程语言的应用之间进行异步通信。 常见的消息中间件类型包括: 1. JMS(Java Message S…

形态学图像处理(Morphological Image Processing)

形态学图像处理(Morphological Image Processing) 前言 ‍ 本博客为个人总结数字图像处理一课所写,并给出适当的扩展和相应的demo。 写博客跟做 checkpoint​ 很像,毕竟个人还不能达到那种信手拈来的境界,忘了就是从零开始训练&#xff0…

LeetCode 面试经典 150 题回顾

目录 一、数组 / 字符串 1.合并两个有序数组 (简单) 2.移除元素 (简单) 3.删除有序数组中的重复项 (简单) 4.删除有序数组中的重复项 II(中等) 5.多数元素(简单&am…

项目进度计划表:详细的甘特图的制作步骤

甘特图(Gantt chart),又称为横道图、条状图(Bar chart),是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特(Henry Laurence Gantt)发明,是一种通过条状图来…

netty之内存泄露检测

写在前面 本文看下netty内存泄露检测相关内容,当然,这里的内存泄露不是bytebuf对象本身,是bytebuf关联的堆外内存。 1:实战 我们还是使用netty源码的example模块的echo例子,但是我们需要对server的handler稍微做些改…