定时器-PWM参数测量实验

试验目的:测量PWM信号参数

1.实验原理

PA6:定时器TIM3_CH1(产生待测PWM信号)

PA8:定时器TIM1_CH1(跟待测PWM信号连接),负责对PWM信号进行测量

PA9:USART1_Tx(连接USB转TTL),发送测量结果到电脑

串口初始化:

初始化IO引脚再初始化USART1模块本身

串口初始化代码(包含测试)

cs 复制代码
#include "stm32f10x.h"
#include "usart.h"

void App_USART1_Init (void);

int main(void)
{
	App_USART1_Init ();
	
	My_USART_SendString (USART1, "你好世界");
	
	while(1)
	{
	}
}

void App_USART1_Init (void)
{
	//#1.初始化IO引脚PA9AFPP
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct= {0};
	
	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);
	
	//#2.初始化USART1模块
	//#2.1开启USART1模块的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//#2.2配置USART1的参数
	USART_InitTypeDef USART_InitStruct = {0};
	
	USART_InitStruct.USART_BaudRate = 115200;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Tx;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	
	USART_Init(USART1,&USART_InitStruct);
	
	//#2.3闭合总开关
	USART_Cmd(USART1,ENABLE);

2.产生PWM信号

配置时基单元:决定PWM信号周期

使能定时器TIM3时钟、配置参数

配置输出比较通道:输出比较本身、输出比较引脚(初始化引脚)

通过CH1输出信号

定时器TIM3初始化代码

cs 复制代码
void App_TIM3_Init (void)
{
	//#1.初始化时基单元
	//#1.1开启TIM3的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	//1.2 配置时基单元的参数
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct = {0} ;
	
	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);
	
	//1.3开启ARR的预加载
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	
	//#1.4 闭合时基单元的总开关
	TIM_Cmd(TIM3, ENABLE);
	
	//#2.初始化输出比较的通道1
	//#2.1初始化A6GPIO 
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE) ;
	
	GPIO_InitTypeDef GPIO_InitStruct = {0} ;
	
	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) ;
	
	//#2.2配置oC1的参数
	TIM_OCInitTypeDef TIM_OCInitStruct = {0};
	
	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);
	
	//#2.3 使能MOE
	TIM_CtrlPWMOutputs (TIM3,ENABLE);
	
	//#2.4 使能CCRx的预加载
	TIM_CCPreloadControl (TIM3,ENABLE);

}

PA6连接到PA13,可以把板载LED当做指示灯测试呼吸灯代码(测试定时器TIM3)

测试代码:

cs 复制代码
	while(1)
	{
		float t =GetTick()*1.0e-3f;
		float duty=0.5*(sin(2*3.14*t) + 1);
		uint16_t ccrl = duty * 999;
		
		TIM_SetCompare1(TIM3, ccrl);
	}

产生占空比为百分之二十的信号

cs 复制代码
			TIM_SetCompare1(TIM3, 200);

3.初始化时基单元

cs 复制代码
void App_TIM1_Init (void)
{
	//#1.配置时基单元
	//#1.1开启定时器1的时钟
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_TIM1, ENABLE);
	
	//#1.2配置时基单元的参数
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct = {0};
	
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = 65535;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
	
	//#1.3开启ARR的预加载
	TIM_ARRPreloadConfig (TIM1,ENABLE);
	
	//#1.4闭合时基单元的总开关
	TIM_Cmd(TIM1,ENABLE);
}

4.初始化输入捕获

cs 复制代码
	//#2.初始化输入捕获
	//#2.1初始化A8引脚IPD
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//#2.2初始化输入捕获通道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_DIV1;
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
	
	TIM_ICInit (TIM1, &TIM_ICInitStruct);
	
	//#2.3初始化输入捕获通道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_DIV1;
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;
	
		TIM_ICInit (TIM1, &TIM_ICInitStruct);

5.初始化从模式控制器

cs 复制代码
	//#3.初始化从模式控制器
	//#把TI1FP1选作TRGI输入信号
	TIM_SelectInputTrigger (TIM1, TIM_TS_TI1FP1);
	//把TRGI模式设置为复位模式
	TIM_SelectSlaveMode (TIM1, TIM_SlaveMode_Reset);

6.测量PWM参数

cs 复制代码
	while(1)
	{
		//#1.清除Trigger标志位
		TIM_ClearFlag (TIM1, TIM_FLAG_Trigger);
		
		//#2.等待Trigger标志位从0变成1
		while (TIM_GetFlagStatus (TIM1, TIM_FLAG_Trigger) == RESET) ;
		
		//$3.计算
		uint16_t ccrl = TIM_GetCapture1 (TIM1);
		uint16_t ccr2 = TIM_GetCapture2 (TIM1) ;
		
		float period = ccrl * 1.0e-6f * 1.0e3f;
		float duty = ((float)ccr2) / ccrl * 100.0f;

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

	}

总结:

总代码:

cs 复制代码
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include <math.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 ();
	
//	My_USART_SendString (USART1, "你好世界");
	
			TIM_SetCompare1(TIM3, 200);
	
	while(1)
	{
		//#1.清除Trigger标志位
		TIM_ClearFlag (TIM1, TIM_FLAG_Trigger);
		
		//#2.等待Trigger标志位从0变成1
		while (TIM_GetFlagStatus (TIM1, TIM_FLAG_Trigger) == RESET) ;
		
		//$3.计算
		uint16_t ccrl = TIM_GetCapture1 (TIM1);
		uint16_t ccr2 = TIM_GetCapture2 (TIM1) ;
		
		float period = ccrl * 1.0e-6f * 1.0e3f;
		float duty = ((float)ccr2) / ccrl * 100.0f;

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

//		float t =GetTick()*1.0e-3f;
//		float duty=0.5*(sin(2*3.14*t) + 1);
//		uint16_t ccrl = duty * 999;
		

	}
}

void App_USART1_Init (void)
{
	//#1.初始化IO引脚PA9AFPP
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct= {0};
	
	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);
	
	//#2.初始化USART1模块
	//#2.1开启USART1模块的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//#2.2配置USART1的参数
	USART_InitTypeDef USART_InitStruct = {0};
	
	USART_InitStruct.USART_BaudRate = 115200;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Tx;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	
	USART_Init(USART1,&USART_InitStruct);
	
	//#2.3闭合总开关
	USART_Cmd(USART1,ENABLE);
}

void App_TIM3_Init (void)
{
	//#1.初始化时基单元
	//#1.1开启TIM3的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	//1.2 配置时基单元的参数
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct = {0} ;
	
	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);
	
	//1.3开启ARR的预加载
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	
	//#1.4 闭合时基单元的总开关
	TIM_Cmd(TIM3, ENABLE);
	
	//#2.初始化输出比较的通道1
	//#2.1初始化A6GPIO 
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE) ;
	
	GPIO_InitTypeDef GPIO_InitStruct = {0} ;
	
	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) ;
	
	//#2.2配置oC1的参数
	TIM_OCInitTypeDef TIM_OCInitStruct = {0};
	
	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);
	
	//#2.3 使能MOE
	TIM_CtrlPWMOutputs (TIM3,ENABLE);
	
	//#2.4 使能CCRx的预加载
	TIM_CCPreloadControl (TIM3,ENABLE);

}

void App_TIM1_Init (void)
{
	//#1.配置时基单元
	//#1.1开启定时器1的时钟
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_TIM1, ENABLE);
	
	//#1.2配置时基单元的参数
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct = {0};
	
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = 65535;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
	
	//#1.3开启ARR的预加载
	TIM_ARRPreloadConfig (TIM1,ENABLE);
	
	//#1.4闭合时基单元的总开关
	TIM_Cmd(TIM1,ENABLE);
	
	//#2.初始化输入捕获
	//#2.1初始化A8引脚IPD
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	//#2.2初始化输入捕获通道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_DIV1;
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
	
	TIM_ICInit (TIM1, &TIM_ICInitStruct);
	
	//#2.3初始化输入捕获通道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_DIV1;
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;
	
	TIM_ICInit (TIM1, &TIM_ICInitStruct);
	
	//#3.初始化从模式控制器
	//#把TI1FP1选作TRGI输入信号
	TIM_SelectInputTrigger (TIM1, TIM_TS_TI1FP1);
	//把TRGI模式设置为复位模式
	TIM_SelectSlaveMode (TIM1, TIM_SlaveMode_Reset);
}
相关推荐
comyccccc8 小时前
STM32F103C8T6最小系统板设计全解析学习笔记
单片机·1024程序员节
Industio_触觉智能8 小时前
把NPU检测直接嵌进采集终端|RK3576 AI采集终端全链路拆解教程-下
嵌入式硬件·ai·硬件架构·npu·ai视觉·rk3576·采集终端
en.en..9 小时前
STM32 GPIO ODR 与 BSRR 寄存器完整对比详解
单片机·嵌入式硬件
HQB202612 小时前
EG1182|屹晶微电子 60V 内置高压管异步降压 DC‑DC
嵌入式硬件·硬件工程
LCG米13 小时前
STM32硬件SPI驱动SSD1306 OLED实测:上电黑屏排查、页寻址模式与取模扫描方向陷阱
stm32·单片机·嵌入式硬件·嵌入式
深圳老胡14 小时前
STM32C5A3ZG 网络调试总结:从启动失败到连续 Ping 稳定
笔记·stm32·单片机·代码规范
qq_4017004114 小时前
100 个 IoT 小项目,给 ESP32 入门补上实操
前端·网络·stm32
硅基造物主14 小时前
STM32 从 0 到 1 做智能家居(八):PWM 控制风扇、加热片与 SG90 窗帘
stm32·嵌入式硬件·智能家居·hal库·pwm
简单电磁炮14 小时前
关于adc采集
stm32·单片机
HQB202615 小时前
EG1163 (S)|屹晶微电子 600V 高压同步降压半桥控制器
嵌入式硬件·硬件工程