定时器-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);
}
相关推荐
恶魔泡泡糖3 小时前
51单片机串口通信
c语言·单片机·嵌入式硬件·51单片机
wotaifuzao3 小时前
【Keil 5安装】keil 5最新版本安装+环境配置+下载百度资源分享(安装包,注册机等)
stm32·单片机·嵌入式硬件·mcu·学习·keil5·最新keil
染予3 小时前
8.AD软件操作:绘制一个完整的原理图需要进行哪些操作?
嵌入式硬件
方芯半导体5 小时前
EtherCAT “通信 + 控制“ 的全国产化控制方案,ESC芯片(FCE1323)与国产MCU芯片功能板解析
xml·网络·单片机·嵌入式硬件·网络协议·机器人·自动化
三佛科技-134163842125 小时前
LP3716NCK 隔离型12V1A 12W茶炉板电源方案典型应用电路与设计关键
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
羽获飞6 小时前
从零开始学嵌入式之STM32——5.GPIO外设
stm32·单片机·嵌入式硬件
望眼欲穿的程序猿7 小时前
串口通信---串口2定时器2
stm32·单片机·嵌入式硬件
望眼欲穿的程序猿7 小时前
STC/Ai8051U 中断列表
单片机·嵌入式硬件·stc
国科安芯8 小时前
航空级PMSM驱动系统中MCU的故障诊断与容错控制策略研究
单片机·嵌入式硬件·安全·架构·制造·安全性测试