商业网站建设平台,制作软件的软件,商城平台开发公司,银行 网站开发 干什么理论 预分频寄存器(TIMx_PSC)#xff1a;由于时钟源为#xff1a;72MHz#xff0c;T 1/f 1/72MHz#xff0c;由于不好计算周期时间#xff0c;则需要分频#xff0c;若分72则T 1/1MHz 1us(1MHz 一百万秒)
计数方式#xff1a;向上(递增到某个数触发中断)、向下(递… 理论
预分频寄存器(TIMx_PSC)由于时钟源为72MHzT 1/f 1/72MHz由于不好计算周期时间则需要分频若分72则T 1/1MHz 1us(1MHz 一百万秒)
计数方式向上(递增到某个数触发中断)、向下(递减到某一个数触发中断)、中心计数(递增到某一个数触发中断再递减到某一个数触发中断)
比较值(参考链接) PWM1模式若计数值小于有效值则高电平计数值大于有效值则低电平可以控制比较值来调节占空比 PWM2模式与PWM1模式相反计数值小于有效值则低电平大于有效值则高电平
复用Pin脚本身除了支持普通GPIO功能之外还支持别的功能(使用别的功能就叫复用)
重映射Pin脚本身不支持这些功能配置重映射寄存器使其具备别的功能 定时器分类
型号STM32F103ZET6
基本定时器TIM6、TIM7 通用定时器TIM2~TIM5 高级定时器TIM1、TIM8 代码编写
定时器中断实验LED灯一秒闪烁一次、LED灯两秒闪烁一次、计算单片机运行时间、串口5秒返回单片机运行时间
PWM信号输出呼吸灯、电机(由慢到快)、舵机
输入捕获检测信号脉冲宽度(舵机脉冲宽度) LED灯、UART、定时器、PWM配置
LED灯配置请看链接
串口配置请看链接
配置定时器
72/7200 0.01T 1/f 1/0.01MHz 100us计数10000触发中断100us * 10000 1s1s 1000000us但单片机都是以0开始所以分频值以及计数值都 -1 配置定时器向上计数溢出中断NVIC(嵌套向量中断控制器) 定时器(PWM)控制LED灯配置
LED(PB5)引脚说明
所以配置定时器3通道二但配置完发现图中不符需手动修改 定时器(PWM)控制电机配置
配置PB4引脚PWM控制电机速度 定时器(PWM)控制舵机配置
舵机脉冲周期20ms 输入捕获定时器配置 配置定时器全局中断NVIC LED灯闪烁、串口输出运行时间
LED1每隔一秒电平翻转一次LED2每隔两秒电平翻转一次串口输出单片机运行时间 Cube IDE代码
main.c
/* USER CODE BEGIN Includes */
#include stdio.h //27行
#include string.h //28行
/* USER CODE END Includes *//* USER CODE BEGIN 0 */
uint32_t G_Timer_Count 0; //59行
uint8_t UART_Count[200];
uint8_t UART_Flag 0;
/* USER CODE END 0 *//* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(htim1); //开启定时器97行
/* USER CODE END 2 */if(UART_Flag) //104行
{sprintf(UART_Count,MCU run time is %lus,G_Timer_Count);HAL_UART_Transmit(huart1, UART_Count, strlen(UART_Count), 1000);UART_Flag 0; //打印一次后标志0等中断五次(5s)后
}/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //定时器触发函数,157行
{if(htim htim1){HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);G_Timer_Count;if((G_Timer_Count % 5) 0)UART_Flag 1; //每隔五秒让标志1if((G_Timer_Count % 2) 0) //LED2每隔两秒翻转电平HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);}}
/* USER CODE END 4 */PWM信号LED呼吸灯、电机、舵机
理论参考链接
PWM信号控制LED产生一个呼吸灯效果以及对电机控制控制速度由慢到快 Cube IDE代码
main.c
/* USER CODE BEGIN PV */
uint8_t PWM_Value 0,LED_PWM_Value 0,SG_PWM 5; //47行
/* USER CODE END PV *//* USER CODE BEGIN 2 */
//参数1定时器句柄(指向配置好的定时器结构体的指针)参数2定时器通道,93行
HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_2); //开启定时器3通道2 PWM
HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); //开启定时器3通道1 PWM
HAL_TIM_PWM_Start(htim4, TIM_CHANNEL_1); //开启定时器4通道1 PWM
/* USER CODE END 2 *///103行
PWM_Value;
PWM_Value PWM_Value % 200;
if(PWM_Value 99)LED_PWM_Value 200 - PWM_Value; //大于99时从大到小(100,99...)
elseLED_PWM_Value PWM_Value;
HAL_Delay(25);
//参数1定时器句柄参数2定时器通道,参数3比较值
__HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_2, LED_PWM_Value); //设置LED比较值
__HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, LED_PWM_Value); //设置电机比较值if(PWM_Value % 30 0)
{//每0.1ms计数值1则0.5ms比较值模式1则占空比(高电平)0.5msSG_PWM 5;if(SG_PWM 25)SG_PWM 5;__HAL_TIM_SET_COMPARE(htim4, TIM_CHANNEL_1, SG_PWM); //设置舵机比较值
}输入捕获(IC)
捕获高电平持续时间 Cube IDE代码
捕获PWM高电平的时间
main.c
/* USER CODE BEGIN PTD */
uint32_t ic_state0,period_count0,ic_count0,us_count; //32行
/* USER CODE END PTD *//* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(htim2); //开启普通定时器中断HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_2); //开启捕获定时器中断printf(Please connect MCU51 P2.0,and let SG90 run to detect signal!\n); //串口输出捕获的时间(记得配置串口重定向)
/* USER CODE END 2 */if(ic_state 2 ) //103行(while里)
{/* 始终设置的是1us触发计数值加1* 一个周期大概65ms若大于65只有捕获中断函数不好使* 若period_count为1则代表过了一个中断周期时间(1*65535)us* 若没有到整个中断周期时间则剩下的为ic_count* 所以两个相加等于整个高电平时间*/us_count ic_count period_count * 0xFFFF;printf(High level duration: %ldus \n,us_count); //(float)(us_count)/1000.000ic_state 0; //再将中间键恢复0方便下次上升沿触发中断计时
}/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) //输入捕获触发函数,161行
{if(TIM2 htim-Instance){if ( ic_state 0 ){__HAL_TIM_SET_COUNTER(htim,0); //将定时器从零开始计时__HAL_TIM_SET_CAPTUREPOLARITY(htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); //设置成下降沿触发ic_state 1; //下次触发中断时(下降沿)则运行elseperiod_count 0;ic_count 0;}else{ic_count HAL_TIM_ReadCapturedValue(htim2,TIM_CHANNEL_2); //读取定时器计数值__HAL_TIM_SET_CAPTUREPOLARITY(htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); //设置成上降沿触发ic_state 2; //进入while里面的判断}}
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //普通定时器中断触发函数
{if(TIM2 htim-Instance){if(ic_state1){if(period_count0XFFFF) //一次周期大约65ms若进入这个需要(65*65535)ms{ic_state2;ic_count0XFFFF; //返回一个超大数显示错误}elseperiod_count;}}
}
/* USER CODE END 4 */