【stm32】用从模式控制器 完成PWM的测量

embedded/2025/3/27 10:29:48/

🌞学习视频还是来自于 铁头山羊
🌿主要是回顾一下他讲的这一章的定时器的部分,具体的话 还是看一下具体铁头山羊的视频,讲的很清楚~~

整体流程是这样的,首先通过定时器的输出比较功能,配置好PA6产生一个特定的PWM,然后再利用PWM输入捕获+从模式 测量出该PWM的占空比和周期

也就是自产自测的过程

产生一个PWM

首先需要一个PWM,这样才有信号给测嘛,这个过程我们用TIM3进行
也就是:
主要步骤和关键函数

//1.时基单元配置
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
//配置预加载 防止寄存器跑飞
TIM_ARRPreloadConfig(TIM3,ENABLE);
//闭合时基单元开关
TIM_Cmd(TIM3,ENABLE);//2.初始化输出比较
初始化输出的引脚 PA6
//配置输出比较
TIM_OC1Init(TIM3, &TIM_OCInitStruct);//闭合开关 MOE
TIM_CtrlPWMOutputs(TIM3,ENABLE);//使能CCRx预加载
TIM_CCPreloadControl(TIM3,ENABLE);

具体的代码如下

void PWM1_Init(void){//1.时基单元配置RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period=999;TIM_TimeBaseInitStruct.TIM_Prescaler=71;TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//配置预加载 防止寄存器跑飞TIM_ARRPreloadConfig(TIM3,ENABLE);//闭合时基单元开关TIM_Cmd(TIM3,ENABLE);//2.初始化输出比较//初始化输出的引脚 PA6RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef gpio_init_struct;gpio_init_struct.GPIO_Mode=GPIO_Mode_AF_PP;gpio_init_struct.GPIO_Pin=GPIO_Pin_6;gpio_init_struct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_Init(GPIOA,&gpio_init_struct);//配置输出比较TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStruct.TIM_OutputState=ENABLE;TIM_OCInitStruct.TIM_Pulse=0;TIM_OC1Init(TIM3, &TIM_OCInitStruct);//闭合开关 MOETIM_CtrlPWMOutputs(TIM3,ENABLE);//使能CCRx预加载TIM_CCPreloadControl(TIM3,ENABLE);}

通过从模式完成输入捕获

主要完成下面几个块的配置

后面的测量部分,需要配置下面的部分
在这里插入图片描述

//1.时基单元配置 TIM1 这里用的是另一个TIM
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);
//配置预加载 防止寄存器跑飞
TIM_ARRPreloadConfig(TIM1,ENABLE);
//闭合时基单元开关
TIM_Cmd(TIM1,ENABLE);//2.初始化输入捕获
//输入捕获引脚 输入上拉IPU PA8
//配置输入捕获通道1和通道2
TIM_ICInit//初始化从模式输入
TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);
//初始化 从模式控制器
TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);

具体代码如下

//时基单元初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler=71;TIM_TimeBaseInitStruct.TIM_Period=65535;TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);//配置预加载 防止寄存器跑飞TIM_ARRPreloadConfig(TIM1,ENABLE);//闭合时基单元开关TIM_Cmd(TIM1,ENABLE);//初始化输入捕获引脚 输入上拉IPU PA8RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef gpio_init_struct;gpio_init_struct.GPIO_Mode=GPIO_Mode_AF_PP;gpio_init_struct.GPIO_Pin=GPIO_Pin_8;gpio_init_struct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_Init(GPIOA,&gpio_init_struct);//初始化输入捕获通道1TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;TIM_ICInitStruct.TIM_ICFilter=0;//不用滤波器TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;TIM_ICInit(TIM1, &TIM_ICInitStruct);//初始化输入捕获通道2TIM_ICInitStruct.TIM_Channel=TIM_Channel_2;TIM_ICInitStruct.TIM_ICFilter=0;//不用滤波器TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Falling;TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_IndirectTI;TIM_ICInit(TIM1, &TIM_ICInitStruct);//初始化从模式输入TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);//初始化 从模式控制器TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);

主函数

主要的逻辑是长这样的,当完成出发时候Trigger 从0变成1 这个时候就可以计算CCR1 CCR2的值,然后就可以计算PWM的占空比和周期了
在这里插入图片描述

int main(void)
{My_Usart_Init1();TIM1_Slave_Init();PWM1_Init();TIM_SetCompare1(TIM3,200);//产生一个20%占空比的信号 周期1mswhile(1){//1.清除Trigger标志位TIM_ClearFlag(TIM1,TIM_FLAG_Trigger);//2.等待Trigger标志位从0变成1while(TIM_GetFlagStatus(TIM1,TIM_FLAG_Trigger)==RESET);//3.计算uint16_t ccr1=TIM_GetCapture1(TIM1);uint16_t ccr2=TIM_GetCapture2(TIM1);float period=ccr1*1.0e-5;float duty=(float)ccr2/ccr1*100;	My_USART_Printf(USART1,"period=%.3fms,duty=%.2f%%\r\n",period,duty);		Delay(100);}
}

http://www.ppmy.cn/embedded/176692.html

相关文章

基于Python+Flask+MySQL+HTML的爬取豆瓣电影top-250数据并进行可视化的数据可视化平台

FlaskMySQLHTML 项目采用前后端分离技术,包含完整的前端,以flask作为后端 Pyecharts、jieba进行前端图表展示 通过MySQL收集格列数据 通过Pyecharts制作数据图表 这是博主b站发布的详细讲解,感兴趣的可以去观看:【Python爬虫可…

【MySQL】一篇讲懂什么是聚簇索引和非聚簇索引(二级索引)以及什么是回表?

1.聚簇索引: 叶子节点直接存储了完整的数据行。 每个表只能有一个聚簇索引,通常是主键(Primary Key)。如果没有定义主键,则MySQL会选择一个唯一且非空索引作为聚簇索引。 特点: 数据存储:叶子结点存储完整的数据行…

docker 容器 php环境中安装gd 、mysql 等扩展

1、先配置阿里云镜像源 cd /etc/apt echo "" > sources.list echo "deb http://mirrors.aliyun.com/debian/ bullseye main contrib" >> /etc/apt/sources.list echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main contrib&q…

MySQL中DDL、DML、DQL、DCL四种语言详细介绍

对比: 分类英文全称中文全称作用常见命令DDLData Definition Language数据定义语言定义和修改数据库结构CREATE, DROP, ALTER, TRUNCATEDMLData Manipulation Language数据操作语言操作表中的数据(增、删、改)INSERT, UPDATE, DELETEDQLData…

【SpringCloud】微服务的治理以及服务间的远程调用

目录 一、微服务的诞生 二、服务注册和发现 2.1 需求的产生 2.2 注册中心原理 2.3 Nacos注册中心 2.4 Nacos安装部署教程 2.5 配置Nacos 三、OpenFeign 3.1 认识OpenFeign 3.2 快速入门 3.2.1 引入依赖 3.2.2 启动OpenFeign 3.2.3 编写OpenFeign客户端 3.2.4 使…

什么是TCP,UDP,MQTT?

以下内容来源于抖音,作者织点代码,读者根据文章内容以及相应论文添加自己的理解进行注释。 计算机之间怎么通信? 彼此之间用网线连接在一起就可以了 但是这样子太麻烦了,成本太高,操作也麻烦 集线器 于是我们可以把线拧在一起 而拧在一起的这个设备,就是集线器 但集线…

【程序人生】成功人生架构图(分层模型)

文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层:调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…

Four.meme是什么,一篇文章读懂

一、什么是Four.meme? Four.meme 是一个运行在 BNB 链的去中心化平台旨在为 meme 代币供公平启动服务。它允许用户以极低的成本创建和推出 meme 代币,无需预售或团队分配,它消除了传统的预售、种子轮和团队分配,确保所有参与者有…