【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录

  • 1、PWM
    • PWM配置
  • 2、输入捕获配置
  • 3、编码器

1、PWM

image-20241219143627929

PWM配置

  1. 配置时基单元
  2. 配置输出比较单元
  3. 配置输出PWM波的端口
#include "stm32f10x.h"                  // Device headervoid PWM_Init(void)
{
//**配置输出PWM波的端口*****************************************************************RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);// 使能GPIOA端口的时钟,因为我们要使用这个端口来输出PWM信号GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;   GPIO_Init(GPIOA, &GPIO_InitStruct);
//*************************************************************************************
//**配置时基单元************************************************************************RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能时钟TIM_InternalClockConfig(TIM2);// 配置定时器的内部时钟模式//这段代码的作用是将指定的定时器配置为内部时钟模式,即将定时器的时钟源设置为内部时钟,而不是外部信号TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定义定时器基本时间配置结构体TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//设置定时器时钟分频(1分频)TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数模式(向上计数)TIM_TimeBaseInitStruct.TIM_Period = 100 - 1;//自动重装载寄存器的值ARRTIM_TimeBaseInitStruct.TIM_Prescaler = 720 - 1;//预分频器的值PSC//1khz    TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
//*************************************************************************************
//**配置输出比较单元********************************************************************TIM_OCInitTypeDef TIM_OCInitStruct;//定义输出比较初始化结构体TIM_OCStructInit(&TIM_OCInitStruct);//结构体赋初始值TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//输出使能TIM_OCInitStruct.TIM_Pulse = 0;//设定CCR寄存器的值;更改CRR的值,以控制占空比(CCR/(ARR+1))TIM_OC1Init(TIM2, &TIM_OCInitStruct);
//*************************************************************************************TIM_Cmd(TIM2, ENABLE);//启用定时器,PB0口输出PWM波
}void PWM_SetCompare1(uint16_t Compare)//设置CRR的值以控制占空比(CCR/(ARR+1))
{TIM_SetCompare1(TIM2, Compare);
}

2、输入捕获配置

#include "stm32f10x.h"                  // Device header
//PWMI模式
//输入捕获测频率 PA6口void IC_Init(void)
{//配置输入捕获的io口RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;//PA6对应TIM3GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);//配置时基单元RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//开启时钟TIM_InternalClockConfig(TIM3);//配置定时器的内部时钟模式//这段代码的作用是将指定的定时器配置为内部时钟模式,//即将定时器的时钟源设置为内部时钟,而不是外部信号TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//1分频TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数模式(向上计数)TIM_TimeBaseInitStruct.TIM_Period = 65536 - 1;//自动重装载寄存器的值ARRTIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1;//预分频器的值PSC TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);//配置输入捕获单元TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道1TIM_ICInitStruct.TIM_ICFilter = 0x10;//指定输入捕获过滤器TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//1分频TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//直连通道TIM_ICInit(TIM3, &TIM_ICInitStruct);//自动配置通道2,下降沿TIM_PWMIConfig(TIM3, &TIM_ICInitStruct);//设置触发源TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);//选择从模式TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//启动定时器TIM_Cmd(TIM3, ENABLE);
//*************************************************************************************
}uint32_t IC_GetFreq(void)//获取频率
{return 1000000 / ((TIM_GetCapture1(TIM3)) + 1);//TIM_GetCapture1此函数可获取CCR1捕获/比较器中的值
}uint32_t IC_GetDuty(void)
{return ((TIM_GetCapture2(TIM3) + 1) * 100)/(TIM_GetCapture1(TIM3) + 1);
}

image-20241225152632356

image-20241225152717082

3、编码器

#include "stm32f10x.h"                  // Device headervoid Encoder2_Init(void)
{//配置GPIORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);//配置时基单元RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//开启定时器时钟TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 65536 - 1;//ARRTIM_TimeBaseInitStruct.TIM_Prescaler = 1 - 1;//PSCTIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICStructInit(&TIM_ICInitStruct);//配置通道1的滤波器和极性TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;TIM_ICInitStruct.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStruct);//配置通道2的滤波器和极性	TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;TIM_ICInitStruct.TIM_ICFilter = 0xF;TIM_ICInit(TIM3, &TIM_ICInitStruct);TIM_EncoderInterfaceConfig(	TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, //不反向TIM_ICPolarity_Rising);//不反向-可控制极性TIM_Cmd(TIM3, ENABLE);
}int16_t Encoder_Get(void)
{return TIM_GetCounter(TIM3);
}int16_t Encoder_GetSpeed(void)
{int16_t Temp_Count = TIM_GetCounter(TIM3);TIM_SetCounter(TIM3, 0);//计数器清零return Temp_Count;}

image-20241225163925175

image-20241225163943410

image-20241225164028067

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

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

相关文章

MongoDB 学习指南:深入探索非关系型数据库

MongoDB学习资料 MongoDB学习资料 MongoDB学习资料 在当今数字化时代,数据量呈爆炸式增长,数据结构也变得愈发复杂多样。传统的关系型数据库在处理一些大规模、高并发以及非结构化数据时,逐渐显露出局限性。而 MongoDB 作为一款领先的非关系…

学习微信小程序的下拉列表控件-picker

1、创建一个空白工程 2、index.wxml中写上picker布局&#xff1a; <!--index.wxml--> <view class"container"><picker mode"selector" range"{{array}}" bindchange"bindPickerChange"><view class"pick…

【神经网络基础】

目录 一、神经网络的构成 1.1什么是神经网络&#xff1f; 1.2 激活函数 1.2.1 Sigmoid 1.2.2 Tanh 1.2.3 ReLU 1.2.4 softmax 1.2.5 其他激活函数 1.2.6 选择激活函数 1.3 参数初始化 1.4 模型构建 二、损失函数 2.1 分类问题 2.1.1多分类&#xff08;多分类交叉…

Mac 使用 GVM 管理多版本 Go 环境

使用 GVM 管理多版本 Go 环境 在本文中&#xff0c;我们将使用 gvm&#xff08;Go Version Manager&#xff09;工具管理本地多个 Go 语言版本。gvm 功能类似于 Python 的 Anaconda&#xff0c;可以方便地切换不同版本的 Go 环境&#xff0c;非常适合需要多版本开发与测试的场…

STM32 学习笔记【补充】(十)硬件I2C读写MPU6050

该系列为笔者在学习STM32过程&#xff08;主线是江科大的视频&#xff09;中的记录与发散思考。 初学难免有所纰漏、错误&#xff0c;还望大家不吝指正&#xff0c;感谢~ 一、I2C 外设简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种多主多从的串行通信协议…

.Net Core webapi 实现JWT认证

文章目录 需求准备创建JWT配置创建JWTService注册JWT创建中间件读取jwt的token在需要的接口上添加属性启动认证启动swagger的授权认证使用 需求 实现一个记录某个用户所有操作的功能 准备 创建你的webapi项目从nuget下载安装JWT资源包根据你的项目使用.net版本下载对应的jwt…

leetcode203-移除链表元素

leetcode203 什么是链表 之前不懂链表的数据结构&#xff0c;一看到链表的题目就看不明白 链表是通过next指针来将每个节点连接起来的&#xff0c;题目中给的链表是单向链表&#xff0c;有两个值&#xff0c;一个val表示值&#xff0c;一个next&#xff1a;表示连接的下一个…

在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerror和pe…

ebno_db_vec 和 num_block_err参数

ebno_db_vec 和 num_block_err 都是与无线通信系统中误码率 (BER) 测试和性能评估相关的变量。 1. ebno_db_vec (0:0.5:5) 7; ebno_db_vec 是一个表示 信噪比 (SNR) 的向量&#xff0c;通常用于测试系统在不同信噪比条件下的性能。具体来说&#xff0c;ebno_db_vec 是通过将…

stack_queue的底层,模拟实现,deque和priority_queue详解

文章目录 适配器Stack的模拟实现Queue的模拟实现vector和list的对比dequedeque的框架deque的底层 priority_queuepriority_queue的使用priority_queue的底层仿函数的使用仿函数的作用priority_queue模拟实现 适配器 适配器是一种模式&#xff0c;这种模式将类的接口转化为用户希…

DNS介绍与部署-Day 01

1. 什么是DNS DNS&#xff08;Domain Name System&#xff09;域名系统&#xff0c;是一种采用客户端/服务器机制&#xff0c;负责实现计算机名称与IP地址转换的系统。DNS作为一种重要的网络服务&#xff0c;既是Internet工作的基础&#xff0c;同时在企业内部网络中也得到了广…

LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145188660 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

杰盛微 IRS2336STRPBF 700V带使能和故障报告的三相反逻辑驱动芯片 SOP28封装

IRS2336STRPBF 700V带使能和故障报告的三相反逻辑驱动芯片 IRS2336是 N型高压、高速功率 MOSFET/IGBT高低侧三相栅极驱动芯片&#xff0c;包含三路独立的半桥驱动电路。内部集成了欠压保护和过流保护功能&#xff0c;出现异常时立即关断六通道输出。提供外部使能控制可同时关断…

深入理解第三范式(3NF):数据库设计中的重要性与实践

title: 深入理解第三范式(3NF):数据库设计中的重要性与实践 date: 2025/1/17 updated: 2025/1/17 author: cmdragon excerpt: 在数据库设计中,规范化是确保数据完整性、减少冗余和提高查询效率的关键过程。第三范式(3NF)作为关系数据库设计的高级规范,建立在前两范式…

mongoose 支持https踩坑纪实

简述 mongoose是C编写的嵌入式web服务&#xff0c;它能够支持https协议&#xff0c;可以简单的部署&#xff0c;但要做到完美部署&#xff0c;不是那么容易。 部署方法 本人使用的是最新的7.16版&#xff0c;以前版本似乎是要通过修改 头文件中的 MG_ENABLE_SSL 宏定义&…

RK3576 Android14 状态栏和导航栏增加显示控制功能

问题背景&#xff1a; 因为RK3576 Android14用户需要手动控制状态栏和导航栏显示隐藏控制&#xff0c;包括对锁屏后下拉状态栏的屏蔽&#xff0c;在设置功能里增加此功能的控制&#xff0c;故参考一些博客完成此功能&#xff0c;以下是具体代码路径的修改内容。 解决方案&…

TypeScript特有运算符和操作符

文章目录 TypeScript 特有运算符1. keyof2. typeof3. in4. extends5. is6. as 和 <Type>7. never8. readonly9. ?10. []11. | 和 &12. !13. ?? 和 ?. 总结 TypeScript 特有运算符 1. keyof 作用&#xff1a;用于获取对象类型的所有键&#xff08;属性名&#x…

C#高级:通过 Assembly 类加载 DLL 和直接引用DLL的方法大全

一、主项目不添加引用 &#xff08;主项目不添加引用&#xff0c;而是通过路径获取指定dll&#xff09; 1.打印类的属性名称 namespace ReflectionDemo {class Program{static void Main(string[] args){// 指定【编译输出】的项目类库dll&#xff08;启动项目编译输出目录下…

【k8s面试题2025】1、练气期

主要通过呼吸吐纳等方法&#xff0c;将外界的天地灵气吸入体内&#xff0c;初步改造身体&#xff0c;使身体素质远超常人。 文章目录 docker 和虚拟机的不同Kubernetes 和 docker 的关系Kube-proxy IPVS 和 iptables 的异同蓝绿发布Kubernetes中常见的数据持久化方式关于 Docke…

音视频入门基础:RTP专题(4)——FFmpeg源码中,判断某文件是否为SDP文件的实现

一、引言 执行《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》中的“媒体文件转推RTP的FFmpeg命令”会生成一个SDP文件&#xff0c;该文件内容如下&#xff1a; v0 o- 0 0 IN IP4 127.0.0.1 sNo Name t0 0 atool:libavformat 61…