STM32_PWM占空比和频率可调
- 格式:docx
- 大小:15.67 KB
- 文档页数:5
STM32 TIM的PMW模式STM32开发板学习日记-[5]TIM的PMW模式脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。
在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。
必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数或中心对称模式中)。
因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。
OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP 位设置,它可以设置为高电平有效活或低电平有效。
TIMx_CCER寄存器中的CCxE位控制OCx输出使能。
在PWM模式(模式1或模式2)下,TIMx_CNT和TIM1_CCRx 始终在进行比较,(依据计数器的计数方向)以确定是否符合TIM1_CCRx≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRx。
然而为了与OCREF_CLR的功能(在下一个PWM周期之前,ETR信号上的一个外部事件能够清除OCxREF)一致,OCxREF信号只能在下述条件下产生:●当比较的结果改变●当输出比较模式(TIMx_CCMRx寄存器中的OCxM位)从“冻结”(无比较,OCxM=’000’)切换到某个PWM模式(OCxM=’110’或’111’)。
(纯干货)使用STM32测量频率和占空比的几种方法
使用平台:官方STM32F429DISCOVERY开发板,180MHz的主频,定时器频率90MHz。
相关题目:
(1)测量脉冲信号频率f_O,频率范围为10Hz~2MHz,测量误差的绝对值不大于0.1%。
(15分)
(2)测量脉冲信号占空比D,测量范围为10%~90%,测量误差的绝对值不大于2%。
(15分)
思路一:外部中断
思路:这种方法是很容易想到的,而且对几乎所有MCU都适用(连51都可以)。
方法也很简单,声明一个计数变量TIM_cnt,每次一个上升沿/下降沿就进入一次中断,对TIM_cnt++,然后定时统计即可。
如果需要占空比,那么就另外用一个定时器统计上升沿、下降沿之间的时间即可。
缺点:缺陷显而易见,当频率提高,将会频繁进入中断,占用大量时间。
而当频率超过100kHz时,中断程序时间甚至将超过脉冲周期,产生巨大误差。
同时更重要的是,想要测量的占空比由于受到中断程序影响,误差将越来越大。
总结:我们当时第一时间就把这个方案PASS了,没有相关代码(这个代码也很简单)。
不过,该方法在频率较低(10K以下)时,可以拿来测量频率。
在频率更低的情况下,可以拿来测占空比。
思路二:PWM输入模式
思路:翻遍ST的参考手册,在定时器当中有这样一种模式:
简而言之,理论上,通过这种模式,可以用硬件直接测量出频率和占空比。
当时我们发现这一模式时欢欣鼓舞,以为可以一步解决这一问题。
STM32的PWM调节转速原理主要基于PWM(Pulse Width Modulation)脉冲宽度调制。
通过编程控制输出方波的频率和占空比(高低电平的比例),可以实现对电机转速的控制。
在直流电机驱动中,PWM调速的基本原理是通过控制电机通电的电压来实现转速的调节。
当提高电压时,反电势升高,进而转速升高。
因此,通过控制PWM信号的占空比,可以实现对电机通电电压的调节,从而控制电机的转速。
在STM32中,可以通过定时器产生PWM信号,并通过调节占空比来控制电机的转速。
具体实现方式如下:
1.设置定时器工作模式为PWM模式,并配置相应的PWM通道和占空比。
2.根据需要调节占空比的值,以控制电机通电的电压。
3.将PWM信号输出到电机驱动器,从而实现对电机转速的控制。
需要注意的是,具体的PWM调速实现方式可能会因电机的类型、驱动器的型号等因素而有所不同。
因此,在实际应用中,需要根据具体情况进行相应的调整和配置。
stm32输出pwm占空比代码在STM32单片机中,输出PWM(脉冲宽度调制)信号是非常普遍的操作,这种信号通常用于控制电机、LED灯等电子设备的亮度或运动状态。
本文将详细介绍STM32单片机如何输出PWM占空比代码。
一、配置TIM定时器要输出PWM信号,首先需要进行TIM定时器的配置。
在KEIL C 编译器中,可以通过CubeMX插件进行配置。
在此之前需要先引入库文件“stm32fxx_hal_tim.h”。
在CubeMX中选择对应的TIM,进入“Mode”选项卡,将TIM定时器配置为PWM输出模式。
在“Configuration”选项卡中,配置TIM的时钟源和预分频系数等信息。
此外还需要配置PWM的周期和占空比,具体可以通过下面的步骤实现。
二、设置PWM周期在代码中设置PWM周期,可以使用HAL库中的“__HAL_TIM_SET_AUTORELOAD”函数。
该函数的第一个参数为TIM定时器的句柄,第二个参数为PWM的周期,单位为计数器的值。
可以根据需要调整该值来改变PWM的输出频率。
例如,将PWM周期设置为1000,代码如下:__HAL_TIM_SET_AUTORELOAD(&htim1, 1000);三、设置PWM占空比在代码中设置PWM占空比,需要使用HAL库中的“__HAL_TIM_SET_COMPARE”函数。
该函数的第一个参数是TIM定时器的句柄,第二个参数是设置输出PWM的通道,第三个参数是占空比。
占空比的取值范围为0到PWM周期。
例如,将PWM占空比设置为500,代码如下:__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500);四、使用PWM输出信号最后,在代码中使用PWM输出信号,可以使用HAL库中的“HAL_TIM_PWM_Start”函数。
该函数的参数为TIM的句柄和输出PWM 的通道。
例如,在TIM1通道1上启动PWM输出,代码如下:HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);以上就是STM32单片机输出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输出。
STM32Cubemx输出可调频率与占空⽐的PWM 这⾥就不对STM32的PWM进⾏讲解了,想要了解的可以百度⼀下,这⾥主要说怎么实现。
1、建⽴⼯程,我选的是STM32F103zet6芯⽚,选择定时器的PWM功能 2、配置时钟,我这⾥配的是内部时钟,没有配外部时钟,⽽且不是最⼤时钟,有需要的可以⾃⼰改 3、配置定时器,这⾥的话默认就可以,因为代码⾥⾯需要对配置的初始化代码进⾏修改的,⽽修改后才可以实现该功能 4、⽣成代码后,修改代码,找到PWM初始化函数,修改为如下代码,注意要把初始化函数前⾯的static关键字也去掉,⽽且函数声明也要跟着修改void MX_TIM4_Init(uint16_t pre,uint16_t pul) //修改初始化函数,改变频率与PWM{//占空⽐=Pulse/Period;频率:f=48M/pre/perTIM_MasterConfigTypeDef sMasterConfig;TIM_OC_InitTypeDef sConfigOC;htim4.Instance = TIM4;htim4.Init.Prescaler =pre; //分频(关键)htim4.Init.Period = 100-1;//计数周期(关键,若100的计数周期对于⼀些频率跟占空⽐误差⼤的话,可以⾃⼰计算更改调试计数周期⼤⼩)htim4.Init.CounterMode = TIM_COUNTERMODE_UP;htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_PWM_Init(&htim4) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = pul;//脉冲计数(关键)sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}HAL_TIM_MspPostInit(&htim4);} 5、接着在⾃⼰需要的代码⾥插⼊,PWM开始停⽌函数就可以啦HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); //PWM开启函数MX_TIM4_Init(uint16_t pre,uint16_t pul);//改变参数就可实现改变占空⽐跟频率的⽬的了HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);//停⽌PWM 这⾥我说⼀下核⼼部分:占空⽐ = (Pulse/Period)*100%;频率: f = 48M/Prescaler/Period;影响PWM占空⽐跟频率的参数这主要是 Pulse、Prescaler、Period这3个;频率跟占空⽐都与Period(计数周期)有关,只要我们把计数周期定下来,修改Prescaler、跟Pulse 这两个值,就可以直接修改PWM的频率跟占空⽐了。
STM32编程输出可调的硬件PWM,频率范围1Hz【原创】编程输出可调的硬件PWM,频率范围1Hz-1MHz,占空比0-100%uint32_t TIM4_PWM_FQ = 50; /* TIM4_CH1_PWM输出频率设置值,1-1000000 */uint32_t TIM4_PWM_FQ_Old = 0;uint16_t TIM4_PWM_Pulse = 50; /* TIM4_CH1_PWM输出占空比设置值,0-100 */uint16_t TIM4_PWM_Pulse_Old = 0;uint32_t SystemCoreClock = 168000000;/** 函数功能: 定时器4配置为硬件PWM模式(不开启TIM4的定时及DMA传输中断)* TIM4_PWM_FQ: TIM4_CH1_PWM 频率1Hz至1000000Hz* TIM4_PWM_Pulse: TIM4_CH1_PWM 占空比 0-100%*/void StdPeriph_TIM4_PWM_Config(void){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;uint32_t temp32;uint32_t uhTimerfrequency;uint16_t uhTimerPeriod;uint16_t uhTimerPulse;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);#ifdef USE_PB6_PWM// TIM4_CH1_PWM: PB6RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);// GPIOB ConfigurationGPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4);#else// TIM4_CH1_PWM: PD12RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);// GPIOD ConfigurationGPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);#endifuhTimerfrequency = 200000; /* 初始化 200KHz */temp32 = ((SystemCoreClock /2) / uhTimerfrequency);if(temp32 > 65535) temp32 = 65535;uhTimerPeriod = (uint16_t) temp32;uhTimerPulse = uhTimerPeriod * 50 / 100; /* 占空比50% */// Time base configurationTIM_TimeBaseStructure.TIM_Period = uhTimerPeriod - 1; /* 0x0000 and 0xFFFF */TIM_TimeBaseStructure.TIM_Prescaler = 0; /* 0x0000 and 0xFFFF */TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);// PWM1 Mode configuration: Channel1TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = uhTimerPulse;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC1Init(TIM4, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM4, ENABLE);TIM_GenerateEvent(TIM4, TIM_EventSource_Update);TIM_Cmd(TIM4, ENABLE);}/** 函数功能: 刷新TIM4_CH1_PWM输出的频率和占空比* 修改TIM4_PWM_FQ的值,调节PWM频率(1Hz至1MHz)* 修改TIM4_PWM_Pulse的值,调节PWM的占空比(0-100)*/void StdPeriph_TIM4_PWM_Update(void){uint32_t temp32;uint32_t uhTimerfrequency;uint16_t uhTimerPeriod;uint16_t uhTimerPrescaler;uint16_t uhTimerPulse;if ((TIM4_PWM_FQ_Old != TIM4_PWM_FQ) || (TIM4_PWM_Pulse_Old != TIM4_PWM_Pulse)){TIM4_PWM_FQ_Old = TIM4_PWM_FQ;TIM4_PWM_Pulse_Old = TIM4_PWM_Pulse;if(TIM4_PWM_FQ >= 4000){uhTimerfrequency = TIM4_PWM_FQ; /* 定时器计时频率和PWM频率相等 */uhTimerPrescaler = 1; /* 实际频率TIM4_PWM_FQ较大时,TIM4设置分频为1(不分频) */}else{uhTimerfrequency = 4000; /* 实际频率TIM4_PWM_FQ较小时,和4000Hz的频率比较,看相差几倍 */uhTimerPrescaler = 4000 / TIM4_PWM_FQ; /* 实际频率和4000相差的倍数作为TIM4的分频设置值 */uhTimerfrequency = uhTimerPrescaler * TIM4_PWM_FQ; /* TIM4分频后,计时周期变长,需要将uhTimerfrequency倍频 */ }/* TIM4的周期要通过倍频uhTimerfrequency来计算,uhTimerPeriod = 84MHz / uhTimerfrequency */temp32 = ((SystemCoreClock /2) / uhTimerfrequency);if(temp32 > 65535) temp32 = 65535;uhTimerPeriod = (uint16_t) temp32;if(TIM4_PWM_Pulse > 100) TIM4_PWM_Pulse = 100;uhTimerPulse = uhTimerPeriod * TIM4_PWM_Pulse/ 100;TIM4->ARR = uhTimerPeriod - 1;TIM4->PSC = uhTimerPrescaler - 1;TIM4->CCR1 = uhTimerPulse;TIM4->EGR = TIM_PSCReloadMode_Update;}}。
#include "stm32f10x_lib.h"
void RCC_cfg();
void GPIO_cfg();
void TIMER_cfg();
void PWM_cfg();
//占空比,取值范围为0-100
int dutyfactor = 50;
int main()
{
int Temp;
RCC_cfg();
GPIO_cfg();
TIMER_cfg();
PWM_cfg();
//使能TIM3计时器,开始输出PWM
TIM_Cmd(TIM3, ENABLE);
while(1);
}
void RCC_cfg()
{
//定义错误状态变量
ErrorStatus HSEStartUpStatus;
//将RCC寄存器重新设置为默认值
RCC_DeInit();
//打开外部高速时钟晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速时钟晶振工作
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
//设置AHB时钟(HCLK)为系统时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//设置高速AHB时钟(APB2)为HCLK时钟
RCC_PCLK2Config(RCC_HCLK_Div1);
//设置低速AHB时钟(APB1)为HCLK的2分频
RCC_PCLK1Config(RCC_HCLK_Div2);
//设置FLASH代码延时
FLASH_SetLatency(FLASH_Latency_2);
//使能预取指缓存
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//设置PLL时钟,为HSE的9倍频8MHz * 9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能PLL
RCC_PLLCmd(ENABLE);
//等待PLL准备就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//设置PLL为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//判断PLL是否是系统时钟
while(RCC_GetSYSCLKSource() != 0x08);
}
//开启TIM3的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//开启GPIOB的时钟和复用功能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |
RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_cfg()
{
GPIO_InitTypeDef GPIO_InitStructure;
//部分映射,将TIM3_CH2映射到PB5
// GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
//选择引脚5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
//输出频率最大50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void TIMER_cfg()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//重新将Timer设置为缺省值
TIM_DeInit(TIM3);
//采用内部时钟给TIM3提供时钟源
TIM_InternalClockConfig(TIM3);
//预分频系数为0,即不进行预分频,此时TIMER的频率为72MHz
TIM_TimeBaseStructure.TIM_Prescaler = 0;
//设置时钟分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//设置计数器模式为向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//设置计数溢出大小,每计7200个数就产生一个更新事件,即PWM的输出频率为10kHz
TIM_TimeBaseStructure.TIM_Period = 7200 - 1;
//将配置应用到TIM3中
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
}
void PWM_cfg()
{
TIM_OCInitTypeDef TimOCInitStructure;
//设置缺省值
TIM_OCStructInit(&TimOCInitStructure);
//PWM模式1输出
TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100% TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;
//TIM输出比较极性高
TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//使能输出状态
TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM3的CH2输出
TIM_OC2Init(TIM3, &TimOCInitStructure);
//设置TIM3的PWM输出为使能
TIM_CtrlPWMOutputs(TIM3,ENABLE);
}。