STM32-微项目05-输入检测测试PWM周期

一、微项目实现目标:

利用TIM2定时器产生的PWM波,输入到TIM3输入检测模块,在接收到输入的PWM信号,模块进行计算,在OLED上打印对应的频率

(总结来说,测周法,测试周期频率)

二、微项目硬件配置需求:

stm32F103C8T6核心板一块

0.96寸OLED显示,用于显示计数

三、前置知识:

整个项目由两大块组成:1,输出比较模式控制输出不同周期的PWM数据;2,输入比较模式下,检测输入的PWM波

1,输出比较模式控制输出不同周期的PWM数据:

 

①选择PWM1模块,在CNT计数值<CCR时刻,REF置为有效电平,在CNT计数值>=CCR,且小于ARR时刻,REF置为无效电平;

2,输入检测检测PWM周期

 ①时基单元:主要配置PSC/ARR数值,时钟源选择72MHZ内部时钟

②输入捕获单元的配置。

1-滤波器主要是对于信号进行滤波处理;

2-边沿检测极性选择主要来判断极性;

3-分频器,再一次进行分频处理;如果分频因子为2,则捕获两次上升沿,才认为有效

③从模式选择

 在识别上升沿后,触发从模式,清空CNT

输入捕获PWM周期的整体逻辑:

1,时基单元,按照设定的PSC,输入的时钟源信号进行计数处理,当收到输入捕获模式的触发源后,将CNT的数值转移CCR1寄存器中,CCR1的值就是本次计数的数据,在进行一轮计算就可以得到输入的频率,f_x=f_c / N

2,紧接着触发的从模式,会将CNT的数据进行清0,进行下一轮的计数。

3,每次产生触发都是从0开始计数的,所以转移的CNT值就是实际的两次上升沿之间的时间占比

四、代码逻辑分析

主要两大块

1,PWM输出比较模块

①开启TIM2时钟、PA0时钟

②配置时钟源

③配置时基模块参数

④配置输出比较模块参数

⑤配置PA0端口

⑥开启时钟

2,输入比较模块

①开启TIM3时钟、PA6时钟

②配置时钟源

③配置时基模块

④配置输入单元模块

⑤配置从模式

⑥配置GIPO端口

⑦开启时钟

五、代码示例:

1,PWM输出比较模块

①开启TIM2时钟、PA0时钟

//配置时钟RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

②配置时钟源

//配置时钟源为RCC -72mhz
	TIM_InternalClockConfig(TIM2);

③配置时基模块参数

	//配置时基单元数值
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up ;
	TIM_TimeBaseInitStruct.TIM_Period=100-1;  //ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;  //psc
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);

④配置输出比较模块参数

TIM_OCStructInit(&TIM_OCInitStruct);用于进行默认初始化,原因是,后面的初始化仅对部分参数进行设定,为防止bug,先进行一次默认初始化

	//输出比较单元配置
	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数值

	TIM_OC1Init(TIM2, &TIM_OCInitStruct);

⑤配置gpio_PA0端口  复用推挽输出

// 配置PA0端口
	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);
	

⑥开启时钟

	//启动定时器
	TIM_Cmd(TIM2,ENABLE);

⑦动态配置CCR的数值,输出不同占空比

动态配置psc的数值,输出不同频率

void pwm_setcompare( uint16_t compare)
{
	TIM_SetCompare1(TIM2, compare);
}
void pwm_setPerscaler(uint16_t prescaler )//修改psc的数值,达到修改pwm频率
{
	TIM_PrescalerConfig(TIM2,  prescaler, TIM_PSCReloadMode_Immediate);
	
}

2,输入比较模块

①开启TIM3时钟、PA6时钟

	//开启GPIO、TIM的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//tim3

②配置PA6端口的输入模式-上拉输入

//配置PA6端口
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

③配置时钟源 72mhz

//时基单元时钟源配置--系统时钟72MHZ
	TIM_InternalClockConfig(TIM3);

④配置时基单元

	//时基单元配置
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up ;
	TIM_TimeBaseInitStruct.TIM_Period=65536-1; //ARR
	TIM_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 ;//输入捕获的端口
	TIM_ICInitStruct.TIM_ICFilter=0xf;//输入捕获的滤波器
	TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising ;//捕获的状态 上升沿/下降沿
	TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1 ;//分频器,如果是二分频,则两次输出一次
	TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;//属于直连通道还是交叉通道
	TIM_ICInit( TIM3, & TIM_ICInitStruct);

⑥从模式配置

//从模式触发源选择
	TIM_SelectInputTrigger( TIM3, TIM_TS_TI1FP1);
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

⑦开启时钟

//开启时钟
	TIM_Cmd(TIM3, ENABLE);

⑧配置输出频率计算模块

f_x=f_c / N

uint32_t IC_getfreq(void)
{
	return 1000000/TIM_GetCapture1(TIM3);
}

最后在main函数中简单配置

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "OLED.H"
#include "PWM.H"
#include "ic.H"

uint32_t freq=0;

int main()
{

	OLED_Init();
	OLED_ShowString(1,3,"freq:");
	pwm_init();
	ic_init();
	pwm_setcompare(50);//duty=CCR/100  占空比
	pwm_setPerscaler(720-1); //freq=72M/(psc+1)/100  频率
	while(1)
	{
		freq=IC_getfreq();
		OLED_ShowNum(2,1,freq,5);
		
	}
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: ​ STM32-STLink是一款常见的STM32单片机的USB调试工具,它可以方便地进行芯片的程序下载、烧录、调试和监测工作。在使用STM32-STLink进行调试工作前,需要先安装STM32-STLink驱动。 STM32-STLink驱动可以在ST官网或软件开发社区中获取。在安装驱动前需要确保电脑已经连接上STM32-STLink,并且已经准备好了相应的开发环境。建议先卸载旧版本的驱动再进行安装。 具体操作步骤如下: 1. 连接STM32-STLink到电脑,确保正常供电和通信。 2. 安装驱动,可以从ST官网或者软件开发社区中下载最新驱动程序。 3. 解压下载的驱动程序,双击运行安装程序。 4. 驱动安装过程中需要注意选择与自己操作系统版本相对应的驱动程序,勾选“核心组件”和“驱动程序”选项,进行安装。 5. 安装完成后,重启电脑,确认驱动程序已经成功安装。 6. 打开开发环境,并连接STM32-STLink,进行调试工作。在调试过程中,可以通过STLink Utility等工具进行芯片的操作。 总之,STM32-STLink驱动是STM32单片机开发必备的驱动程序之一。通过安装该驱动,可以方便地进行芯片的调试工作和程序烧录操作。 ### 回答2: stm32-stlink驱动是一种用于连接STM32单片机与电脑的驱动。STM32是一种低功耗、高性能的32位控制器,而stlink是一种芯片级调试工具,用于将计算机与STM32单片机连接起来,进行程序的调试和下载。由于stm32-stlink驱动具备高性能、可靠性和灵活性等优势,因此在计算机与STM32单片机之间的数据传输过程中发挥了重要作用。 stm32-stlink驱动可以实现多种不同的功能。例如,在调试过程中,它可以帮助开发者调试程序,并实时监测STM32单片机的运行情况。此外,该驱动还可以实现对单片机的程序下载、烧录、刷写等操作,方便开发者进行快速迭代和测试。 除了实现上述功能之外,stm32-stlink驱动还具备多种其他特点。例如,该驱动可以长时间稳定运行,且不会对系统稳定性产生不利影响。此外,该驱动还具备自动适配的能力,可以适应不同版本的STM32单片机。 在使用stm32-stlink驱动之前,开发者需要根据自己的需要进行安装和配置。具体来说,需要下载适合自己系统版本的stm32-stlink驱动,并在电脑上安装。此外,在进行开发过程中,开发者还需要根据需要对该驱动进行相应的设置和调整,以保障程序的正常运行。 总的来说,stm32-stlink驱动是一种实现STM32单片机与电脑之间数据传输的重要工具,具备多种优势和特点。在进行相关开发工作时,合理配置和使用该驱动可以极大地提高开发效率和程序稳定性。 ### 回答3: STM32-STLINK驱动是用于连接计算机和STM32控制器开发板之间的软件程序。STM32-STLINK驱动可用于下载代码,调试和仿真控制器。STM32-STLINK驱动由STMicroelectronics提供,并且是免费提供的。该驱动程序可以在Windows和Linux操作系统上使用,并且支持多种开发工具,例如Keil,IAR和Atollic。 在使用STM32-STLINK驱动之前,需要先将开发板与计算机连接。连接过程可以通过USB连接或JTAG/SWD接口完成。当前,STMicroelectronics生产的大多数STM32控制器都具有内置的ST-LINK / V2-1调试器,因此无需单独购买ST-LINK外设。只需使用USB线缆将STM32板连接到计算机上,即可使用STM32-STLINK驱动。 一旦STM32开发板和计算机连接成功并且安装了STM32-STLINK驱动,就可以开始进行下载、调试和仿真控制器的工作了。STM32-STLINK驱动提供了基本的调试工具,例如设置断点、查看变量和跟踪程序执行等功能,以帮助开发人员进行程序调试。此外,该驱动程序还支持许多高级功能,例如实时追踪、功耗分析和定时器分析等,以帮助开发人员更深入地了解和优化代码。 综上所述,STM32-STLINK驱动是连接STM32控制器和计算机之间的关键软件程序,用于下载、调试和仿真控制器。它具有易于使用和灵活的优点,是STM32开发的重要工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值