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


产生PWM信号

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

初始化输入捕获

初始化从模式控制器

测量PWM参数

#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);
}


浙公网安备 33010602011771号