定时器-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);
}
相关推荐
硬禾科技30 分钟前
连接世界的工程哲学
嵌入式硬件·测试工具·自动化·硬件工程
深圳市青牛科技实业有限公司 小芋圆34 分钟前
GC1808:高性能、低成本的立体声音频ADC芯片
人工智能·嵌入式硬件·无人机·太阳能逆变器
fhq_fn_jgd40 分钟前
51单片机(串口通信)
单片机·嵌入式硬件
深圳市元恩微科技开发有限公司1 小时前
兆讯恒达(北京兆讯)MH2457 系列 国产屏驱 MCU
单片机
沸速存储1 小时前
AI 机器人靠哪些内存与存储驱动整机运行?
服务器·科技·嵌入式硬件·电脑
深圳市恒锐丰科技杨生2 小时前
EG6288 220V 三相独立半桥栅极驱动芯片|屹晶 EGmicro
嵌入式硬件·硬件工程
Brilliantwxx2 小时前
【STM32】 I2C_EEPROM_test 工程(实战篇)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
en.en..2 小时前
UDP套接字编程完整标准流程(服务端+客户端)
单片机·嵌入式硬件
斑马1393 小时前
单片机学习笔记(一)——STC89C52的GPIO、LED、数码管、定时器和中断
单片机·stc89c52
安河桥。3 小时前
SOME/IP 技术说明文档
嵌入式硬件·车载系统·信息与通信