使用STM32测量脉宽可变的PWM波的脉冲宽度

本文介绍了使用STM32F103ZET6通过定时器3和定时器5测量PWM波脉冲宽度的过程。硬件包括定时器、串口和按键,通过输入捕获通道测量高电平持续时间,详细讨论了代码实现、测试结果及可能遇到的问题,如溢出处理和中断服务。
摘要由CSDN通过智能技术生成

最近受疫情影响导致我莫得办法出去玩,打游戏一不小心又给打通关了就只能找点东西玩玩了,所以就有了下面这篇文章。。。。。。搞这个东西的时候遇见一些好玩的问题,我写在第6部分,希望能帮到看到这篇小文章的同志们

1.硬件平台:stm32f103zet6,正点原子的精英板
2.使用到的硬件:定时器3,定时器5,串口1,按键
3.描述:使用定时器3产生一个pwm波,占空比可通过串口调试助手调整。把pwm波通过IO和杜邦线输入到定时器5的输入捕获通道以测量pwm波的高电平持续时间,单位为us
4.主要代码

(1).main.c

//1.main.c
#include "stm32f10x.h"
#include "timer.h"
#include "usart.h"
#include "delay.h"
int main(void)
{
   
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	uart_init(115200);
	timer3_ch2_pwm_out(999,7199);//定时器2时钟10khz,溢出时间为100ms,pwm波周期为100ms
	TIM_SetCompare2(TIM3,499);//占空比50%,高电平时间为50ms
	timer5_ch1_capture(0XFFFF,71);//定时器3时钟1Mhz,记一个数为1us,溢出时间为65536us
	while(1)
	{
   
		if(USART_RX_STA&0x8000) 
		{
   
			USART_RX_STA=0;//请注意这里,当字符串接收完成后(即USART_RX_STA&0x8000=1,在system下的usart.c内有相关代码)请在接收中断函数或main内将USART_RX_STA置零,否则将无法完成下次接收
		}
		//一般情况下在这里都会写个delay_ms(10),但是这里延时之后会导致上面的if来不及执行,就会使得无法完成下次的串口接收
	}
}

(2).timer.c

#include "timer.h"
#include "sys.h"
void timer3_ch2_pwm_out(u16 arr,u16 psc)
{
   
	GPIO_InitTypeDef GPIO_InitType;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitType;
	TIM_OCInitTypeDef TIM_OCInitType;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);//部分重映射对应PB5,完全重映射对应PC7,不映射对应PA7,但是PA7并不能生成PWM波,其余两个都可以
	GPIO_InitType.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitType.GPIO_Pin=GPIO_Pin_7;
	GPIO_InitType.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitType);
	
	TIM_TimeBaseInitType.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitType.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitType.TIM_Period=arr;
	TIM_TimeBaseInitType.TIM_Prescaler=psc;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitType);
	
	TIM_OCInitType.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitType.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitType.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OC2Init(TIM3,&TIM_OCInitType);
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
	TIM_ARRPreloadConfig(TIM3,ENABLE);//使占空比的调整在本周期立即生效
	
	TIM_Cmd(TIM3,ENABLE)</
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值