|
本帖最后由 zhjb1 于 2019-1-2 10:21 编辑 为了测试多路Timer本例选择了独立带有PWM输出的TIM1,3。只好用这2个TIMn来测试PWM。 由于是独立的2个时钟,所以周期等都不同,分别依次为2KHz,5KHz。由于我的主频为内置8MHz,时钟树最高只能设到64MHz,按照这个来设置其它的。导出工程文件。 当STM32CumeMX选设好后,可以在对应的tim.c中重新设置各项参数,还是很方便的。具体在STM32CubeMX中的TIM1的配置中截了3张图,分别是PING,Parment Settings和GPIO Settings,见图23_3_1~3。PWM2的Time3的设置与之相同之事频率为5K,设置值为199。- a' C8 l! ~5 b8 N# Y 在在自定义变量中添加变量: int16_t pwm1=499,pwm3=199。 main前添加LED测试程序,原来的减少到1个: //TEST LEDs) @) j7 [) j) Q% } void ledTest(void){7 d3 e$ W3 K- z if(HAL_GPIO_ReadPin(GPIOC,LED1_Pin)){1 H" P. T- ~8 }9 v* l6 j7 ] HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_RESET); }else{ HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_SET); u. X% S2 n/ l( H4 q }; c0 o8 o7 N2 y2 d }/ ]; D% n" S# J2 f% l- c 在main的里面前边添加函数:5 f( E K5 W, F" x4 D MX_TIM1_Init();1 [' |7 D5 g; G) f2 ^ MX_TIM3_Init();- K V; T: e% S5 V4 n4 S HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);//PA_11_2KHz HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//PB_5__5KHz 在循环体中添加: ledTest();3 L; \! b% `0 E HAL_Delay(10);. v3 w5 i5 _% b adc_getvalue(); if(pwm1<490)pwm1+=4;else pwm1=10; TIM1->CCR4=pwm1;//PA_11_2KHz if(pwm3<195)pwm3+=2;else pwm3=5; TIM3->CCR2=pwm3;//PB_5__5KHz 编译下载,结果见组合照片23_3_4,波形见照片23_3_5和23_3_6。特别打开tim.c,可以看到TIM1的函数:: [2 w# E1 L& [! f% ]/ X- l. D) t. { void MX_TIM1_Init(void){ TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC;# o+ q$ H% r4 s! x TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;4 h+ y, P1 @" E9 I htim1.Instance = TIM1;* m+ o2 o# W6 j( u! R/ b htim1.Init.Prescaler = 63;: n( ?8 c& z' r" g( X' @: U htim1.Init.CounterMode = TIM_COUNTERMODE_UP;; E8 O5 q( b1 N7 v" j. L# E1 C htim1.Init.Period = 499;* W$ c" U, o5 J htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 8; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_PWM_Init(&htim1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}' l/ Z6 I! m1 }/ K' H& Q! I sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;8 l0 l! J1 S( s6 R if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);} sConfigOC.OCMode = TIM_OCMODE_PWM1;: T# A4 ?3 ]: ^$ ? sConfigOC.Pulse = 50; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;9 g/ b2 \# b; {" P sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;2 x4 R% A$ Q3 r' U6 u0 b sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}9 r$ D1 [0 Z! l# ^ sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;/ d, G4 @- j# D sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0;9 U& k) G# o* R: l5 n4 u sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;+ \0 \' I; k6 J$ B( R sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW;+ W) c6 ~' j' h, O0 t% ]* [' f7 o sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);} HAL_TIM_MspPostInit(&htim1); } htim1.Init.Period = 499; 改变499可以改变输出频率,改变PWM输出频率周期,尝试过10K[设置为9]输出波形很好。; @. {4 _: |/ P8 _1 _( s' c9 G) p 顺便在此节将Systick也做了测试,将原来主函数中的程序计数器js变量放在systick函数中加1,主程序中判断超出999999清零。代码分别如下: 在main后边添加systick函数:, N/ V5 Q( B% `1 @ //Systick Return void HAL_SYSTICK_Callback(void){ tickCnt++;) h$ z u! | e" r. [ if(10==tickCnt){tickCnt=0;js++;}//改变10可以改变计数速度0 @) T0 C+ w4 h% l: R }' V9 Z. o* I& u5 ~4 t# B8 u; J4 Y' w 更改void SystemClock_Config(void)函数最后部分的: HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);9 q- q) \3 f7 J& |, P 后边的实数可以改变Systick中断时间,如上大约为1ms中断一次,每10次js增加1。( a5 Q6 z9 g x8 v |
23-3
23-3
23-3
23-3
23-3
23-3
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
楼主大大厉害 |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版