STM32学习-40-[定时器]PWM参数测量实验

实验原理

image

image

产生PWM信号

image

配置时基单元后
配置输出比较的通道

初始化时基单元

image

初始化输入捕获

image

初始化从模式控制器

image

测量PWM参数

image

#include "stm32f10x.h"

void App_USART1_Init(void);
void App_TIM3_Init(void);
void App_TIM1_Init(void);

int main(void)
{
	App_USART1_Init();
	App_TIM3_Init();
	App_TIM1_Init();

	// 输出20%占空比的PWM
	TIM_SetComparel(TIM3, 200);

	while(1)
	{
		// 清除Trigger标志位
		TIM_ClearFlag(TIM1, TIM_FLAG_Trigger);

		// 等待Trigger标志位从0变1
		while(TIM_GetFlagStatus(TIM1, TIM_FLAG_Trigger) == RESET);

		// 计算
		uint16_t ccr1 = TIM_GetCapturel(TIM1);
		uint16_t ccr2 = TIM_GetCapture2(TIM1);
		float period = ccr1 * 1.0e-6f * 1.0e3f;
		float duty = ((float)ccr2) / ccr1 * 100.0f;

		My_USART_Printf(USART1, "周期=%.3fms, 占空比=%.2f%%\r\n", period, duty);

		Delay(1000);
	}
}

void App_USART1_Init(void){
	// 1.初始化IO引脚
	RCC_APB2PeriphCLockCmd(RCC_APB2Periph_GPIOA, ENABLE);	// 先启动时钟

	GPIO_InitTypeDef GPIO_InitStruct;	// 定义初始化结构体
	// Tx PA9 复用输出推挽
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;	// 设置配置的引脚编号
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 模式
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; // 最大速度
	GPIO_Init(GPIOA.&GPIO_InitStruct);
	
	// Rx PA10 输入浮空 输入上拉
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 模式
	GPIO_Init(GPIOA, &GPIO_InitStruct); 

	// 2.初始化USART1模块
	RCC_APB2PriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	// 启动UASRT1模块的时钟
 
	// 对串口进行初始化
	USART_InitTypeDef USART_InitStruct;
 
	USART_InitStruct.USART_BaudRate = 115200;	// 设置波特率
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	// 不使用硬件流控
	USART_InitStruct.USART_Mode = USART_Tx | USART_Rx;	// 设置收发方向
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;	// 设置数据位数
	USART_InitStruct.USART_StopBits = USART_StopBits_1;	// 设置停止位
	USART_InitStruct.USART_Parity = USART_Parity_No;	// 设置校验位
 
	// 调用初始化函数
	USART_Init(USART1, &USART_InitStruct);
 
	// 启用USART模块 闭合总开关
	USART_Cmd(USART1, ENABLE);
}

void App_TIM3_Init(void){
	// 初始化时基单元
	// 开启定时器3的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 
	// 配置时基单元的参数
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
	TIM_TimeBaseInitStruct.TIM_Period = 999;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_RepertitionCounter = 0;
 
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); 

	// 开启ARR的预加载
	TIM_ARRPreloadConfig(TIM3, ENABLE);

	// 闭合时基单元的总开关
	TIM_Cmd(TIM3, ENABLE);

	// 初始化输出比较的通道1
	// 初始化IO引脚
	RCC_APB2PeriphCLockCmd(RCC_APB2Periph_GPIOA, ENABLE);	// 先启动时钟

	GPIO_InitTypeDef GPIO_InitStruct;	// 定义初始化结构体
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;	// 设置配置的引脚编号
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 模式
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; // 最大速度
	GPIO_Init(GPIOA.&GPIO_InitStruct);

	// 配置OC1的参数
	TIM_OCInitTypeDef TIM_OCInitStruct = {0};
	TIM OCInitStruct.TIM OCMode = TIM_OCMode PWMl;
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM OCInitStruct.TIM OutputState = ENABLE;
	TIM OCInitStruct.TIM Pulse = 0;
	TIM_OC1Init(TIM3, &TIM_QCInitStruct):

	// 闭合MOE开关
	TIM_CtrlPWMOutputs(TIM3, ENABLE);

	// 使能CCRx的预加载
	TIM_CCPreloadControl(TIM3, ENABLE);
}

void App_TIM1_Init(void){
	// 配置时基单元
	// 开启定时器1的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_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_RepertitionCounter = 0;
 
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);

	// 开启ARR的预加载
	TIM_ARRPreloadConfig(TIM1, ENABLE);

	// 闭合时基单元的总开关
	TIM_Cmd(TIM1, ENABLE);

	// 初始化输入捕获
	// 初始化IO引脚
	RCC_APB2PeriphCLockCmd(RCC_APB2Periph_GPIOA, ENABLE);	// 先启动时钟

	GPIO_InitTypeDef GPIO_InitStruct;	// 定义初始化结构体
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;	// 设置配置的引脚编号
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; // 模式
	GPIO_Init(GPIOA.&GPIO_InitStruct);

	// 初始化输入捕获通道1
	TIM_ICInitTypeDef TIM_ICInitStruct = {0};
	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_DIVl;
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
	TIM_ICInit(TIM1, &TIM_ICInitStruct);

	// 初始化输入捕获通道2
	TIM_ICInitStruct.TIM Channel = TIM_Channel_2;
	TIM_ICInitStruct.TIM ICFilter = 0;
	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;
	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIVl;
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;
	TIM_ICInit(TIM1, &TIM_ICInitStruct);

	// 初始化从模式控制器
	TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);
	TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);
}

image

posted @ 2026-09-03 11:05  灵垚克府  阅读(8)  评论(0)    收藏  举报