STM32 高级定时器-PWM简单使用
stm32高级定时器使用教程

STM32 高级定时器-PWM简单使用2010-04-14 14:49:29| 分类:STM32 | 标签:|举报|字号大中小订阅高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。
共有4个通道有死区有互补。
先是配置IO脚:GPIO_InitTypeDef GPIO_InitStructure;/* PA8设置为功能脚(PWM) */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/*PB13 设置为PWM的反极性输出*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/*开时钟PWM的与GPIO的*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/*配置TIM1*/TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;void Tim1_Configuration(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_DeInit(TIM1); //重设为缺省值/*TIM1时钟配置*/TIM_TimeBaseStructure.TIM_Prescaler = 4000; //预分频(时钟分频)72M/4000=18KTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_Period = 144; //装载值18k/144=125hz 就是说向上加的144便满了 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置了时钟分割不懂得不管 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //周期计数器值不懂得不管TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); //初始化TIMx的时间基数单位/* Channel 1 Configuration in PWM mode 通道一的PWM */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效PA8 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //反向通道也有效 PB13TIM_OCInitStructure.TIM_Pulse = 40; //占空时间144 中有40的时间为高,互补的输出正好相反 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //互补端的极性TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //空闲状态下的非工作状态不管 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //先不管TIM_OC1Init(TIM1,&TIM_OCInitStructure); //数初始化外设TIMx通道1这里2.0库为TIM_OCInit/* TIM1 counter enable开定时器*/TIM_Cmd(TIM1,ENABLE);/* TIM1 Main Output Enable 使能TIM1外设的主输出*/TIM_CtrlPWMOutputs(TIM1,ENABLE);}//设置捕获寄存器1void SetT1Pwm1(u16 pulse){TIM1->CCR1=pulse;}/*操作寄存器改变占空时间*//*****************************************************************************************************************TIM1的定时器通道时间1到4 分别为PB8 PA9 PA10 PA11 而互补输出分别为PB13 PB14PB15中止PB12 。
STM32高级定时器TIM1输出六路带死区互补PWM波形

本文讲述如何配置单片机STM32F407VET6高级定时器TIM1输出六路带死区互补PWM波形。
一、高级定时器TIM1介绍
高级定时器TIM1有5种计数模式:
TIM_CounterMode_Up、TIM_CounterMode_Down
TIM_CounterMode_CenterAligned1
TIM_CounterMode_CenterAligned2
TIM_CounterMode_CenterAligned3
PWM输出有2种模式:
TIM_OCMode_PWM1、TIM_OCMode_PWM2
查看ST官方RM0090参考手册,高级定时器TIM1框图如下:
本文以高级定时器TIM1工作在TIM_CounterMode_Up模式,PWM工作在TIM_OCMode_PWM1为例,讲述如何配置输出六路带死区互补PWM波形。
二、配置代码示例
1.IO配置
硬件IO说明
TIM1_CH1---->PE9 TIM1_CH1N---->PE8
TIM1_CH2---->PE11 TIM1_CH2N---->PE10
TIM1_CH3---->PE13 TIM1_CH3N---->PE12
IO配置具体代码如下:
2. 定时器配置
三、实验测试
1. 测试硬件平台接线
2.测试结果
由测试结果可以看到高级定时器TIM1可以输出六路带死区互补PWM波形。
具体死区时间如何计算,下篇文章会讲解,敬请关注!。
STM32的PWM控制

Pwm输出最基本的调节就是频率和占空比。频率当然又和时钟信号扯上了关系。高级定时器是挂接到APB2上,而通用定时器是挂接到APB1上的。APB1和APB2的区别就要在于时钟频率不同。APB2最高频率允许72MH,而APB1最高频率为36MHZ。这样是不是通用定时器只最高36MHZ频率呢,不是的;通用定时器时钟信号完整的路线应该是下面这样的:
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //设置为pwm1输出模式
TIM_OCInitStructure.TIM_Pulse=500; //设置占空比时间
IState = TIM_OSSIState_Disable;//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //锁定设置
我先用STM32的通用定时器用PWM模式产生四路相同占空比,不同频率的PWM波,配置如下:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2时钟
TIM_InternalClockConfig(TIM2);//使用内部时钟
TIM_BaseInitStructure.TIM_Prescaler=3; //设置TIM时钟频率除数的预分频值
先大致说下通用和高级定时器的区别。通用的可以输出四路pwm信号互不影响。高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。
所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。
stm32 pwm调节转速原理

STM32的PWM调节转速原理主要基于PWM(Pulse Width Modulation)脉冲宽度调制。
通过编程控制输出方波的频率和占空比(高低电平的比例),可以实现对电机转速的控制。
在直流电机驱动中,PWM调速的基本原理是通过控制电机通电的电压来实现转速的调节。
当提高电压时,反电势升高,进而转速升高。
因此,通过控制PWM信号的占空比,可以实现对电机通电电压的调节,从而控制电机的转速。
在STM32中,可以通过定时器产生PWM信号,并通过调节占空比来控制电机的转速。
具体实现方式如下:
1.设置定时器工作模式为PWM模式,并配置相应的PWM通道和占空比。
2.根据需要调节占空比的值,以控制电机通电的电压。
3.将PWM信号输出到电机驱动器,从而实现对电机转速的控制。
需要注意的是,具体的PWM调速实现方式可能会因电机的类型、驱动器的型号等因素而有所不同。
因此,在实际应用中,需要根据具体情况进行相应的调整和配置。
第六章-STM32-定时器的使用-《基于ARM的单片机应用及实践--STM32案例式教学》课件

第六章 STM32 定时器的使用 通用定时器配置步骤
1)TIM3时钟使能 这里我们通过APB1ENR的第1位来设置TIM3的时钟,因为 Stm32_Clock_Init函数里面把APB1的分频设置为2了, 所以我们的TIM3时钟就是APB1时钟的2倍,等于系统时 钟(72M)。 2)设置TIM3_ARR和TIM3_PSC的值 通过这两个寄存器,设置自动重装的值及分频系数。这 两个参数加上时钟频率就决定了定时器的溢出时间。
计数器寄存器:TIMx_CNT 预分频器寄存器:TIMx_PSC 自动装载寄存器:TIMx_ARR
第六章 STM32 定时器的使用 通用寄存器时基单元 1)计数器寄存器:TIMx_CNT
16位的计数器,设定值从1~65535
第六章 STM32 定时器的使用 计数器模式 向上计数模式:计数器从0计数到设定的数值,然后 重新从0开始计数并且产生一个计数器溢出事件。
在定时器配置完了之后,因为要产生中断,必不可少的 要设置NVIC相关寄存器,以使能TIM3中断。
6)编写中断服务函数 编写定时器中断服务函数,通过该函数处理定时器 产生的相关中断。中断产生后,通过状态寄存器的 值来判断此次产生的中断属于什么类型。然后执行 相关的操作。
第六章 STM32 定时器的使用 通用寄存器时基单元
第六章 STM32 定时器的使用
2)预分频器寄存器:TIMx_PSC 预分频器可以讲计数器的时钟频率按1到65536之间的任 意值分频,它是一个16位寄存器。 这个寄存器带有缓冲区,它能够在工作时被改变。新的 预分频器参数在下一次更新事件到来时被采。
第六章 STM32 定时器的使用 预分频器寄存器在事件更新时采用
定时器的工作频率计算公式为 CK_CNT=定时器时钟/(TIMx_PSC+1) 其中CK_CNT表示定时器工作频率 TIMx_PSC表示分频系数
STM32使用HAL库输出连续可调的PWM信号

STM32使用HAL库输出连续可调的PWM信号1.配置GPIO引脚作为PWM输出。
选择一个合适的GPIO引脚,并将其配置为复用模式,用于PWM输出。
例如,若使用TIM1作为PWM输出定时器,则可以选择GPIO引脚PA8,其复用功能为TIM1_CH12.配置定时器。
使用HAL库初始化和配置所选定的定时器(例如TIM1)作为PWM输出的时基。
设置定时器的时钟源、预分频因子和计数周期。
可以通过修改这些参数来调整PWM信号的频率。
3.配置PWM输出通道。
使用HAL库初始化和配置所选定的PWM输出通道(例如TIM1_CH1)。
设置通道的输出模式和占空比。
可以通过修改占空比来调整PWM信号的高电平时间,从而改变输出电压。
4.启动定时器。
通过调用HAL库中的相关函数,启动所选定的定时器开始计数。
定时器计数到达设定的计数周期后,将会产生一个PWM信号。
5.调整PWM信号的占空比。
通过修改PWM输出通道的占空比,可以改变PWM信号的高电平时间。
通过调整占空比的大小,可以控制PWM信号的输出电压。
6.实时调整PWM信号的频率和占空比。
通过修改定时器的预分频因子和计数周期,可以调整PWM信号的频率。
通过修改PWM输出通道的占空比,可以调整PWM信号的占空比。
可以根据特定的应用需求,实时调整这些参数,来实现连续可调的PWM信号输出。
下面是一个示例代码,演示如何利用HAL库配置和控制STM32的PWM输出:```c#include "stm32f4xx_hal.h"TIM_HandleTypeDef htim1;void SystemClock_Config(void);static void MX_GPIO_Init(void);static void MX_TIM1_Init(void);int main(void)HAL_Init(;SystemClock_Config(;MX_GPIO_Init(;MX_TIM1_Init(;HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);while (1)uint16_t dutyCycle = 500; // 设置占空比为50%__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, dutyCycle); HAL_Delay(1000); // 延时1sdutyCycle = 1000; // 设置占空比为100%__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, dutyCycle); HAL_Delay(1000); // 延时1s}void SystemClock_Config(void)RCC_OscInitTypeDef RCC_OscInitStruct;RCC_ClkInitTypeDef RCC_ClkInitStruct;__HAL_RCC_PWR_CLK_ENABLE(;__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1 );RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 25;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 7;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)Error_Handler(;}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK ,RCC_CLOCKTYPE_PCLK1RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_5) != HAL_OK)Error_Handler(;}void MX_GPIO_Init(void)GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_GPIOA_CLK_ENABLE(;GPIO_InitStruct.Pin = GPIO_PIN_8;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);void MX_TIM1_Init(void)TIM_MasterConfigTypeDef sMasterConfig;TIM_OC_InitTypeDef sConfigOC;htim1.Instance = TIM1;htim1.Init.Prescaler = 0;htim1.Init.CounterMode = TIM_COUNTERMODE_UP;htim1.Init.Period = 1000; // 设置计数周期为1000htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)Error_Handler(;}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim1,&sMasterConfig) != HAL_OK)Error_Handler(;}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 0; // 初始化占空比为0sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC,TIM_CHANNEL_1) != HAL_OK)Error_Handler(;}```这是一个基本的示例,演示了如何使用HAL库配置和控制STM32的PWM输出。
stm32定时器的使用流程

STM32定时器的使用流程1. 简介STM32定时器是STM32系列微控制器中重要的外设之一。
定时器可以用于生成特定的定时器事件,实现计时、测量时间间隔、产生PWM信号等功能。
本文将介绍STM32定时器的使用流程。
2. STM32定时器的基本工作原理STM32定时器通常由一个或多个计数器和若干个通道组成。
计数器用于计算时间的流逝,而通道用于控制输出。
计数器的计数范围和分辨率可以根据需求进行配置。
通常情况下,定时器通过外部时钟源进行计数,也可以使用内部时钟源。
3. STM32定时器的使用流程使用STM32定时器通常需要以下步骤:3.1 初始化定时器在使用定时器之前,需要初始化定时器的相关参数,包括计数器的计数范围、分频系数等。
通常可以通过寄存器的设置来完成初始化工作。
使用HAL库的话,可以使用HAL_TIM_Base_Init()函数进行初始化。
3.2 配置定时器的工作模式定时器可以根据需求配置为不同的工作模式,常见的模式包括单脉冲模式、连续模式、PWM输出模式等。
可以使用TIM_CR1、TIM_CR2等寄存器进行配置。
使用HAL库的话,可以使用相应的函数进行配置。
3.3 配置定时器的中断和DMA定时器可以配置中断和DMA功能,在特定的条件下触发相应的中断或DMA请求。
可以使用TIM_DIER寄存器进行配置。
使用HAL库的话,可以使用相应的函数进行配置。
3.4 启动定时器在配置完成后,需要启动定时器开始计数。
可以使用TIM_CR1寄存器进行配置。
使用HAL库的话,可以使用相应的函数进行配置。
3.5 处理定时器中断如果配置了定时器中断,当定时器达到设定的计数值时,会触发中断。
在中断服务函数中可以根据需求进行相应的处理。
3.6 设置定时器输出如果配置了定时器的通道输出模式,可以在定时器计数到一定值时,通过通道输出相应的信号。
可以使用TIM_CCR1、TIM_CCR2等寄存器进行配置。
3.7 停止定时器如果需要停止定时器的计数,可以使用TIM_CR1寄存器进行配置。
STM32++定时器与+PWM+快速使用入门

STM32 定时器与 PWM 快速使用入门要求:在万利的开发板 EK-STM32F 上产生周期为1秒,占空比分别为 50% 10%的 PWM 并且点亮板上的 LD1,LD2 灯闪烁。
做法很简单。
STM32的PWM是由定时器来产生的。
可以看出。
定时器3的通道1至4在GPIO端口的映像。
如果是完全映射。
各通道的连接引脚如下:CH1=PC6, CH2=PC7, CH3=PC8, CH4=PC9这样,刚好与板上的LD1,LD2灯符合,因为LD1连接到PC7,LD2连接到PC6引脚。
关于PWM一些知识.STM32的TIMx 是 TIMx_ARR 寄存器确定频率(周期)、由TIMx_CCRx 寄存器确定占空比的信号。
使用定时器3。
而TIM2、3、4的时钟源是 APB1 即是 PCLK1 ( APB1 对应 PCLK1 )PCLK1 = APB1 = HCLK/2 = SYSCLK/2 = 36MHZ (36,000,000 HZ)但是注意:倍频器会自动倍2,即是【72MHZ】!代码如下:voidSTM32_PWM_GPIO_Configuration(void){// 11:完全映像STM32_Afio_Regs->mapr.bit.TIM3_REMAP=3;// LD1 =P7 LD2=PC6/*GPIOA Configuration: ( PC6 PC7 ) TIM3 channel 1 and 2 as alternate function push -pull */STM32_Gpioc_Regs-&F6=Output_Af_push_pull; // PC.06 复用功能推挽输出模式STM32_Gpioc_Regs->crl.bit.MODE6=Output_Mode_50mhz; // PC.06 输出模式,最大速度50MHzSTM32_Gpioc_Regs-&F7=Output_Af_push_pull; // PC.07 复用功能推挽输出模式STM32_Gpioc_Regs->crl.bit.MODE7=Output_Mode_50mhz; // PC.07 输出模式,最大速度50MHz}//end subvoidSTM32_TIM3_Configuration(void){// TIM_DeInit( TIM3);//复位TIM3定时器STM32_Rcc_Regs->apb1rstr.all |= RCC_TIM3RST;STM32_Rcc_Regs->apb1rstr.all &= ~RCC_TIM3RST;//时钟使能STM32_Rcc_Regs->apb1enr.all |=RCC_TIM3EN;/* TIM3 base configuration *///TIM_TimeBaseStructure.TIM_Period = 9999;//TIM_TimeBaseStructure.TIM_Prescaler = 7200;//TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);STM32_Tim3_Regs->arr.all=9999; // 定时周期,PWM频率! 10毫秒*100=1秒STM32_Tim3_Regs->psc.all=720; // 7200分频 72MHZ/72,00 72,000,000/72,00=10,000STM32_Tim3_Regs->cr1.bit.CKD=0; // 时钟分频因子STM32_Tim3_Regs->cr1.bit.DIR=0; // 0:计数器向上计数/* Clear TIM3 update pending flag[清除TIM3溢出中断标志] *///TIM_ClearFlag(TIM3, TIM_FLAG_Update);STM32_Tim3_Regs->sr.bit.UIF=0; //更新中断标记由软件清0 ,例如当上溢或下溢时,软件对CNT重新初始化/* PWM1 Mode configuration: Channel1 Channel2 *///TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OC1Init(TIM3, &TIM_OCInitStructure);// timer3 的通道1 是 PC6 引脚, AFIO完全映射STM32_Tim3_Regs-&1P=0; // 输入/捕获1输出极性 0:OC1高电平有效 1:OC1低电平有效STM32_Tim3_Regs-&1E=1; // 输入/捕获1输出使能 1:开启- OC1信号输出到对应的输出引脚。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32 高级定时器-PWM简
单使用
高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。
共有4个通道有死区有互补。
先是配置IO脚:
GPIO_InitTypeDef
GPIO_InitStructure;
/* PA8设置为功能脚(PWM) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,
&GPIO_InitStructure);
/*PB13 设置为PWM的反极性输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,
&GPIO_InitStructure);
/*开时钟PWM的与GPIO的*/
RCC_APB2PeriphClockCmd(RCC_A PB2Periph_TIM1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_A PB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_A PB2Periph_GPIOB, ENABLE);
/*配置TIM1*/
TIM_TimeBaseInitTypeDef
TIM_TimeBaseStructure;
TIM_OCInitTypeDef
TIM_OCInitStructure;
void Tim1_Configuration(void)
{
TIM_TimeBaseInitTypeDef
TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM1); //重设为缺省值
/*TIM1时钟配置*/
TIM_TimeBaseStructure.TIM_Prescaler = 4000; //预分频(时钟分频)72M/4000=18K TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_Period =
144; //装载值18k/144=125hz 就是说向上加的144便满了
TIM_TimeBaseStructure.TIM_ClockDivision =
TIM_CKD_DIV1; //设置了时钟分割 不懂得不管 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0; //周期计数器值 不懂得不管
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructu re); //初始化TIMx 的时间基数单位
/* Channel 1 Configuration in PWM mode 通道一的PWM */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM 模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效 PA8 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //反向通道也有效 PB13
TIM_OCInitStructure.TIM_Pulse = 40; //占空时间
144 中有40的时间为高,互补的输出正好相反
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //互补端的极性 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //空闲状态下的非工作状态 不管
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //先不管
TIM_OC1Init(TIM1,&TIM_OCInitStructure); //数初始化外设TIMx 通道1这里2.0库为TIM_OCInit
/* TIM1 counter enable 开定时器 */ TIM_Cmd(TIM1,ENABLE);
/* TIM1 Main Output Enable 使能TIM1外设
的主输出*/
TIM_CtrlPWMOutputs(TIM1,ENABLE); }
void SetT1Pwm1(u16 pulse) //设置捕获寄存器1
{
TIM1->CCR1=pulse; }
/*操作寄存器改变占空时间*/
/*****************************************************************************************************************
TIM1的定时器通道时间 1到4 分别为 PB8 PA9 PA10 PA11 而互补输出分别为 PB13 PB14 PB15
中止 PB12 。
如果输出与互补输出极性相同的话 就刚好
输出高 互补低 至于PWM 模式1 与模式2的区别
在下图:
这个是模式1的 了绿为输出 黄为互补
*************************************************************************************************
上图是模式2的情况 正好和模式1的反过来了 144中有40 为高 互补的有40为低。
*************************************************************************************************/
/************************************************************
**实验名称:PWM
**功能:是PA8产生PWM 输出,PA8为驱动LED1和马达的IO,
通过UP DOWN 键,可以改变占空比,从而让ED1和小马达的产生变化
**注意事项:LED 是低有效,马达则是高有效,所以LED 全灭的时候马达转速达到最高. **作者:电子白菜
*************************************************************/
#include "STM32Lib\\stm32f10x.h" #include "hal.h"
extern void SetT1Pwm1(u16 pulse); int main(void) {
u16 pulse=40;
ChipHalInit(); //片内硬件初始化 ChipOutHalInit(); //片外硬件初始化 for(;;) {
if(GET_UP()) {
while(GET_UP());
if(pulse<=144) {
pulse+=5;
SetT1Pwm1(pulse);
} }
if(GET_DOWN()) {
while(GET_DOWN()); if(pulse>30) {
pulse-=5;
SetT1Pwm1(pulse); } } } }。