试验目的:测量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);
}