STM32的PWM波形输出例程
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波程序
这是main.c 主程序//这是STM32F103ZE的一个模板//在PA8 PB13 产生一个互补的PWM波,频率为10KHz,占空比为1/5#include "stm32f10x.h"BitAction bbt=0; //定义一个位变量bbt,并清0u16 i;int main(void){u16 InitValue,Pre_Divide,ZKB;SystemInit(); //系统时钟初始化,调用该函数后,系统时钟为72M,函数原形在system_stm32f10x.c中GPIO_init();//****TIM1_PWM波1通道设置****************************************************************InitValue=7200; //初值1000Pre_Divide=1; //预分频1ZKB=1200; //占空比TIM1_PWM_1_init(InitValue,Pre_Divide,ZKB);//TIM1->CCR1=2400; //修改占空比//***************************************************************************** *********while(1){//}}这是sysinit.c 系统程序#include "stm32f10x.h"void GPIO_init(){GPIO_InitTypeDef GPIO_InitStructure; //声明端口结构,需要放在前面RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);//开启相应端口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//***************端口A8,A9,A10是TIM1_PWM波的输出端***************************GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PWM波设为复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //端口频率可设为2,10,50 GPIO_Init(GPIOA, &GPIO_InitStructure); //启动A端口//***************************************************************************//**************端口B13,B14,B15是TIM1_PWM波的互补输出端**********************GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //端口频率可设为2,10,50 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //PWM波的复用推挽输出GPIO_Init(GPIOB,&GPIO_InitStructure); //启动B端口//***************************************************************************}//****TIM1_PWM波1通道初始化**********************************************************************void TIM1_PWM_1_init(u16 InitValue, u16 Pre_Divide, u16 CCR1_Val){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM_BDTRInitTypeDef TIM_BDTRInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);TIM_TimeBaseStructure.TIM_Period =InitValue;TIM_TimeBaseStructure.TIM_Prescaler =Pre_Divide-1;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;TIM_TimeBaseStructure.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);TIM_ARRPreloadConfig(TIM1,ENABLE); //使能TIM1在ARR上的预装载寄存器TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 选择定时器模式TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //选择输出比较状态TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //选择互补输出比较状态TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //选择输出极性TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //选择互补输出极性TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置待装入捕获比较寄存器的脉冲值TIM_OC1Init(TIM1, &TIM_OCInitStructure);//捕获比较匹配器结构1通道赋值TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR1上的预装载寄存器//死区设置TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;//TIM1_OSSRState设置在运行模式下非工作状态选项TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;//TIM1_OSSIState设置在空闲模式下非工作状态选项(使能TIM1 OSSI状态)TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //TIM1_LOCKLevel设置了锁电平参数(不锁任何位)TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //这里调整死区大小0-0xff,TIM1_DeadTIM1指定了输出打开和关闭状态之间的延时TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //TIM1_Break使能或者失能TIM1刹车输入(失能TIM1刹车输入)TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//TIM1_BreakPolarity 设置TIM1刹车输入管脚极性(TIM1刹车输入管脚极性高)TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//TIM1_AutomaticOutput使能或者失能自动输出功能(自动输出功能使能)TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);//(设置刹车特性,死区时间,锁电平,OSSI,OSSR状态和AOE(自动输出使能))TIM_Cmd(TIM1, ENABLE); //使能或者失能指定的TIM1TIM_CtrlPWMOutputs(TIM1, ENABLE); //使能或者失能TIM1外设的主输出}。
stm32输出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信号
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输出。
stm32pwm输出三角波原理
stm32pwm输出三角波原理
在STM32微控制器中,PWM 输出可以实现多种波形,包括方波、正弦波、三角波等。
其中,三角波是一种非常常见的波形,在很多应用场景中都有广泛的应用。
三角波是一种连续的、平滑的波形,其特点是从低电平逐渐升高到高电平,然后再逐渐降低到低电平,如同一个长长的三角形。
在STM32 中,输出三角波需要使用 PWM 模块和定时器,并对定时器的计数器进行配置。
具体来说,输出三角波的原理如下:
1. 配置定时器为向上计数模式,并设置一个合适的计数频率,例如 10 kHz。
2. 配置 PWM 输出通道为定时器输出比较功能,并选择合适的输出极性和时钟分频系数。
3. 在每次定时器计数器达到设定值时,PWM 输出通道会自动翻转输出电平,这将导致三角波的上升和下降。
4. 在每次计数器溢出时,需要重新设置计数器的初始值,以保证连续输出三角波。
5. 如果需要改变三角波的频率或幅值,可以通过改变定时器的计数频率或 PWM 输出通道的占空比来实现。
通过上述方法,可以在 STM32 微控制器中实现三角波的输出。
这种波形非常适合一些需要连续、平滑的变化的应用场景,例如音频信号发生器、电机驱动等。
STM32 笔记通用定时器输出PWM
STM32学习笔记:通用定时器输出PWM分类:STM32学习笔记2014-03-18 19:31 687人阅读评论(0) 收藏举报stm32通用定时器PWM输出脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度、电机转速等。
STM32 的定时器除了TIM6 和7,其他的定时器都可以用来产生PWM 输出。
其中高级定时器TIM1和TIM8可以同时产生高达7路的PWM输出,通用定时器TIM2~TIM5可以同时产生4路PWM输出。
使用通用定时器输出PWM同样需要4步配置,由于输出PWM信号时,不需要定时器中断,所以不需要配置NVIC,但是需要配置TIM_OCInitStructure。
下面已配置TIM2为例:(1)开启系统时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);(2)配置GPIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);(3)配置TIMERTIM_DeInit(TIM2);TIM_TimeBaseStructure.TIM_Period = 3599; //重装载值3600TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频系数0,意味着不分频,由两项参数可算出定时器频率为20KHzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);(4)配置TIM_OCInitStructurevoid TIM2_PWM_Init(void){TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出模式为PWM1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性高,即输出高电平TIM_OCInitStructure.TIM_Pulse =40*36; //设置PWM占空比为40%TIM_OC1Init(TIM2, &TIM_OCInitStructure);//初始化TIM2信道1TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//开启TIM2信道1的预装载寄存器TIM_OCInitStructure.TIM_Pulse =0*36;TIM_OC2Init(TIM2, &TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_Pulse =90*36;TIM_OC3Init(TIM2, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_Pulse =0*36;TIM_OC4Init(TIM2, &TIM_OCInitStructure);TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM2, ENABLE);TIM_Cmd(TIM2, ENABLE);}结构体TIM_OCInitTypeDef的定义为:typedef struct{uint16_t TIM_OCMode;uint16_t TIM_OutputState;uint16_t TIM_OutputNState;uint16_t TIM_Pulse;uint16_t TIM_OCPolarity;uint16_t TIM_OCNPolarity;uint16_t TIM_OCIdleState;uint16_t TIM_OCNIdleState;} TIM_OCInitTypeDef;其中TIM_OCPolarity、TIM_OCMode、TIM_OutputState、TIM_Pulse四个属性是需要我们设置的,其他四个属性是高级定时器TIM1和TIM8才有用的,在这里不做介绍。
使用STM32的定时器产生两路相位互为180度的PWM输出波形
④计数器继续向下计数,减到0时开始调头向上计数;当计数器的数值上升到TIMx_CC2时,CC2再次匹配成功,CC2的输出电平再次翻转;
如此循环,得到连续的相位互为180度的两路输出波形。
基本设置如下:
1)配置定时器的计数器为中间对齐计数,即先向上计数再向下计数。
2)在该定时器上选择2个通道,并分别配置为输出比较模式,并配置在比较成功时翻转对应的引脚输出。
3)配置自动重装载寄存器TIMx_ARR为要求输出频率的一半。
4)假定CC1为第一个输出信号的通道,再假定第一个信号的正脉冲宽度对应为W1,则配置TIMx_CCR1为TIMx_ARR-W1/2。
5) 同4),假定CC2为第二个输出信号的通道,正脉冲宽度对应为W2,配置TIMx_CCR2为W2/2。
----------------------------------------------
下面以一个例子说明:
假设要求输出的信号频率为10kHz,占空比为1:3。
再假设定时器的输入时钟为72MHz。
按照上述5),设置TIMx_CC2=W2/2=450
参照下图,图中红线表示计数器的数值变化:
①当计数器的数值从0向上计数,达到TIMx_CC1时,CC1匹配成功,CC1的输出电平翻转;
②计数器继续向上计数,达到TIMx_ARR时开始调头向下计数;当计数器的数值下降到TIMx_CC1时,CC1再次匹配成功,CC1的输出电平再次翻转;
输出信号的频率10kHz,换算为计数器的数值为7200。
按照上述电平时间W1,换算为计数器的数值为W1=7200/4=1800
stm32的pwm输出及频率计算方法
stm32的pwm输出及频率计算方法
一、stm32的pwm输出引脚是使用的IO口的复用功能。
二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。
三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。
四、给出了PWM频率和占空比的计算公式。
步骤如下:
1、使能TIM3时钟
RCC->APB1ENR |= 1 2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL //PA6清0GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)GPIOA->ODR |= 1
3、设定计数器自动重装值及是否分频
TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)TIM3->PSC = psc;//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可
注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。
//TIM3->CCMR1 |= 6 TIM3->CCMR1 |= 7 TIM3->CCMR1 |= 1
5、输出使能设置
TIM3->CCER |= 1。
如何采用STM32单片机来产生PWM输出
如何采用STM32单片机来产生PWM输出1. TIMER输出PWM基本概念脉冲宽度调制(PWM),是英文“Pulse Width ModulaTIon”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
简单一点,就是对脉冲宽度的控制。
一般用来控制步进电机的速度等等。
STM32的定时器除了基本定时器TIM6和TIM7之外,其他的定时器都可以用来产生PWM 输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。
1.1 PWM输出模式STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM 位确定的(“110”为模式1,“111”为模式2)。
模式1和模式2的区别如下:110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。
由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。
而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节。
1.2 PWM输出管脚PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。
在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。
但是这些重映像的管脚也是由参考手册给出的。
比如说TIM3的第2个通道,在没有重映像的时候,指定的管脚是PA.7,。
STM32Cube学习之七:PWM输出
STM32Cube学习之七:PWM输出假设已经安装好STM32CubeMX和STM32CubeF4支持包。
Step1.打开STM32CubeMX,点击“New Project”,选择芯片型号,STM32F407ZETx。
Step2. 在Pinout界面下配置TIM14的PWM输出,正好是LED0控制引脚。
Step3.在Clock Configuration界面配置使用内部16MHz时钟源,参数默认即可。
Step4.配置TIM14参数。
在configuration界面中点击TIM14按钮,可以进入参数配置界面。
在Parameter Settings页配置预分频系数为15,计数周期(自动加载值)为99,定时器溢出频率,即PWM的周期,就是16MHz/(15+1)/(99+1) = 10kHz。
之所以将极性设置为Low,是因为LED0点亮方式是低电平。
Step5.生成源代码。
点击生成源代码按钮。
在设置界面中输入工程名,保存路径,工程IDE类型,点OK即可。
生成代码完成后可直接打开工程。
弹出如下对话框时,如果已经安装了F4的支持包,则点击OK关闭。
如果没有安装,则点击界面中的/...链接,找到芯片的支持包,然后安装。
关闭后面的界面。
点击“是”,然后选择芯片型号。
可以在搜索框中输入关键字,加快选择速度。
Step6.添加功能代码。
在main函数中定义一个变量pwm_val用于控制PWM输出的占空比。
在while(1)之前使能PWM输出通道CH1。
在while(1)中不断改变PWM输出的占空比,控制LED0的亮度变化,实现一个呼吸灯的效果。
周期约为5秒。
要注意的是,配置的自动加载参数是99,而LED的发光亮度和PWM的占空比并不成正比,当占空比>50%之后,变化就很小了,因此在while(1)中,占空比的变化是范围是0~50。
特别说明:本例的Step4,配置的参数中,控制PWM周期的是预分频器和自动加载寄存器,分别配置了15和99。
stm32的pwm输出及频率计算方法
步骤下:
1、使能TIM3时钟
RCC->APB1ENR |= 1 2、配置对应引脚(PA6)的复用输出功能
GPIOA->CRL&=0XF0FFFFFF;//PA6清0GPIOA->CRL|=
0X0B000000;//复用功能输出(推挽50MHz输出)GPIOA->ODR |= 1
stm32的pwm输出及频率计算方法
一、stm32的pwm输出引脚是使用的IO口的复用功能。
二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。
三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类
似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在
STM32F103RBT6上测试成功,大家放心使用!)。
3、设定计数器自动重装值及是否分频
TIM3->ARR=arr;//设定计数器自动重装值(决定PWM的频率)TIM3-
>PSC = psc;//预分频器,0为不分频
4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相
反),根据需求选一种即可
stm32定时器pwm输出原理
定时器PWM输出原理基于脉冲宽度调制模式(PWM),这是一种利用微处理器的数字输出来对模拟电路进行控制的有效技术。
在PWM模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
当CNT小于CCRx 时,TIMx_CHx通道输出低电平;当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。
因此,所谓脉冲宽度调制模式,就是可以产生一个由TIMx_ARR寄存器确定频率,由TIMx_CCRx寄存器确定占空比的信号。
例如,假设预分频时钟CK_PSC为100MHz,需要产生周期为1ms,占空比为47.5%的PWM信号。
可以通过设置PSC = 99,ARR = 999,Duty = 47.5%,则CRR = 475来实现。
另外,定时器的每个通道都可以输出PWM信号,对于同一个定时器而言,它的多个通道共享同一个自动重载寄存器,因此可以输出占空比不同,但周期相同的PWM信号。
在实际使用中,我们通常需要配置定时器输出通道、设置比较值以及使能预装载寄存器等步骤。
例如,对于定时器1,它的每一个输出通道都是成对的,即TIM1_CH1N与TIM1_CH1两个一组,用于驱动上下两个功率管。
STM32的PWM波形输出例程
STM32的PWM波形输出例程调试芯片:STM32F103C8T6外部晶振:8MHz功能介绍:使用Timer3实现两路(可四路)PWM波形的输出代码如下:初始化:系统时钟初始化,GPIO端口初始化,Timer初始化系统时钟初始化:1./* 配置系统时钟为72M */2.SystemInit();GPIO端口初始化:1./****************************************************************2. * 函数名:void GPIO_Config(void)3. * 描述:配置复用输出PWM时用到的I/O4. * 输入:无5. * 输出:无6. * 调用:main()调用7. ***************************************************************/8.void GPIO_Config(void)9.{10. GPIO_InitTypeDef GPIO_InitStructure;11.12./* GPIOA and GPIOB clock enable */13. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);14.15./*GPIOA Configuration: TIM3 channel 1 and 2 as alternate functionpush-pull */16. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;17. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出18. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;19. GPIO_Init(GPIOA, &GPIO_InitStructure);20.}Timer初始化:1./****************************************************************2. * 函数名:void TIM3_Config(void)3. * 描述:配置TIM3输出的PWM信号的模式4. * CH1:输出 T=2.5ms(f=1/2.5ms=400Hz) D=0.6的PWM波(高电平在前,低电平在后)5. * CH2:输出 T=2.5ms(f=1/2.5ms=400Hz) D=0.4的PWM波(高电平在后,低电平在前)6. * 步骤一:通过T和TIMxCLK的时钟源确定TIM_Period和TIM_Prescaler7. * T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms8. * 因为 TIM_Period<65535,所以 TIM_Prescaler>1,即 TIM_Prescaler=29. * 所以 TIM_Period=59999=0xEA5F10. * 步骤二:根据TIM_Period的值,高低电平的先后D,确定CCR和TIM_OCPolarity11. * CH1:因为D=0.6,先高后低;12. * 所以CCR1=(TIM_Period+1)* D=36000;TIM_OCPolarity=TIM_OCPolarity_High13. * CH2:因为D=0.4,先高后低;14. * 所以CCR1=(TIM_Period+1)* (1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low15. * 步骤三:基础寄存器初始化16. * 步骤四:通道寄存器初始化17. * 步骤五:使能TIM3重载寄存器ARR18. * 步骤六:使能TIM319. * 输入:无20. * 输出:无21. * 调用:main()调用22. ***************************************************************/23.void TIM3_Config(void)24.{25. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;26. TIM_OCInitTypeDef TIM_OCInitStructure;27./* PWM信号电平跳变值 */28. u16 CCR1= 36000;29. u16 CCR2= 36000;30./*PCLK1经过2倍频后作为TIM3的时钟源等于72MHz*/31. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);32./* Time base configuration */33. TIM_TimeBaseStructure.TIM_Period =0xEA5F;34. TIM_TimeBaseStructure.TIM_Prescaler = 2;//设置预分频:预分频=2,即为72/3=24MHz35. TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分频系数:不分频36. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数溢出模式37. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);38./* PWM1 Mode configuration: Channel1 */39. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//配置为PWM模式140. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;41. TIM_OCInitStructure.TIM_Pulse = CCR1;//设置跳变值,当计数器计数到这个值时,电平发生跳变42. TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;//当定时器计数值小于CCR1时为高电平43. TIM_OC1Init(TIM3, &TIM_OCInitStructure);//使能通道144. TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);45./* PWM1 Mode configuration: Channel2 */46. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;47. TIM_OCInitStructure.TIM_Pulse = CCR2;//设置通道2的电平跳变值,输出另外一个占空比的PWM48. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//当定时器计数值小于CCR2时为低电平49. TIM_OC2Init(TIM3, &TIM_OCInitStructure);//使能通道250. TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);51. TIM_ARRPreloadConfig(TIM3, ENABLE);//使能TIM3重载寄存器ARR52./* TIM3 enable counter */53. TIM_Cmd(TIM3, ENABLE);//使能TIM354.}主函数代码:1./***************************************************************2. * 函数名:main3. * 描述:主函数4. * 输入:无5. * 输出:无6. ***************************************************************/7.int main(void)8.{9. SystemInit();10. GPIO_Config();11. TIM3_Config();12.while (1)13. {14.15. }16.}最后上结果图:疑问:虽然不影响用,但是为什么第一个周期不正确,正确的波形是从第二个周期开始输出的?。
STM32 PWM输出总结
学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。
Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2—5是通用定时器。
从名字就可以看得出来主要功能上的差异。
今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。
先大致说下通用和高级定时器的区别。
通用的可以输出四路pwm信号互不影响。
高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。
所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。
接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。
Pwm输出最基本的调节就是频率和占空比。
频率当然又和时钟信号扯上了关系。
高级定时器是挂接到APB2上,而通用定时器是挂接到APB1上的。
APB1和APB2的区别就要在于时钟频率不同。
APB2最高频率允许72MH,而APB1最高频率为36MHZ。
这样是不是通用定时器只最高36MHZ频率呢,不是的;通用定时器时钟信号完整的路线应该是下面这样的:AHB(72mhz)→APB1分频器(默认2)→APB1时钟信号(36mhz)→倍频器(*2倍)→通用定时器时钟信号(72mhz)。
在APB1和定时器中间的倍频器起到了巨大的作用,假如红色字体的“APB1分频器”假如不为1(默认是2),倍频器会自动将APB1时钟频率扩大2倍后作为定时器信号源,这个它内部自动控制的不用配置。
设置这个倍频器的目的很简单就是在APB1是36mhz的情况下通用定时器的频率同样能达到72mhz。
我用的库函数直接调用函数SystemInit(); 这个函数之后时钟配置好了:通用定时器和高级定时器的时钟现在都是72mhz(你也可以自己再配置一下RCC让他的频率更低,但是不能再高了)。
STM32F103PWM输出实验(HAL库)
STM32F103PWM输出实验(HAL库)1、芯⽚输出PWM波形打码步骤 1.0主函数int main(void){HAL_Init(); //初始化HAL库Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72Mdelay_init(72); //初始化延时函数uart_init(115200); //初始化串⼝LED_Init(); //初始化LEDTIM1_PWM_Init(20000,72); //72分频,即1M 。
1000000/20000 = 50 Hz ,即20mswhile(1){TIM_SetTIM1Compare1(1500);}} 1.1初始化输出PWM波形的定时器和IO⼝(例程使⽤定时器1的通道1,输出在PA8)GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_TIM1_CLK_ENABLE(); //使能定时器1__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_8; //PA8GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复⽤推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH; //⾼速HAL_GPIO_Init(GPIOA,&GPIO_Initure); 1.2初始化定时器1,HAL库中,使⽤定时器的 PWM 输出功能时, HAL 库为我们提供了⼀个独⽴的定时器初始化函数 HAL_TIM_PWM_Init ()TIM_HandleTypeDef TIM1_Handler; //定时器句柄TIM1_Handler.Instance=TIM1; //定时器1TIM1_Handler.Init.Prescaler=psc; //定时器分频TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式TIM1_Handler.Init.Period=arr; //⾃动重装载值TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(&TIM1_Handler); //初始化PWM 1.3初始化通道并开启PWMTIM_OC_InitTypeDef TIM1_CH1Handler; //定时器1通道1句柄TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1TIM1_CH1Handler.Pulse=arr/2; //设置⽐较值,此值⽤来确定占空⽐,默认⽐较值为⾃动重装载值的⼀半,即占空⽐为50%TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出⽐较极性为⾼HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH1Handler,TIM_CHANNEL_1);//配置TIM1通道1HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1);//开启PWM通道1 1.4提供设置⽐较值的函数//设置TIM1通道1的占空⽐//compare:⽐较值void TIM_SetTIM1Compare1(u32 compare){TIM1->CCR1=compare;}2、输出PWM原理及代码解释 设置PWM周期和⼀个⽐较值,技术过程中⽐较值和计数值进⾏⽐较,判断输出有效电平还是⽆效电平,达到输出PWM波的⽬的。
STM32定时器输出六路PWM
定时器实验一、实验要求编程序利用STM32的通用定时器TIM2和TIM3产生六路PWM输出。
二、实验原理实验主要考察对STM32F10X系列单片机定时器的使用。
STM32F103系列的单片机一共有11个定时器,其中:✧2个高级定时器✧4个普通定时器✧2个基本定时器✧2个看门狗定时器✧1个系统嘀嗒定时器出去看门狗定时器和系统滴答定时器的八个定时器列表;八个定时器分成3个组TIM1和TIM8是高级定时器TIM2-TIM5是通用定时器TIM6和TIM7是基本的定时器这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式。
本次试验主要用到通用定时器TIM2和TIM3。
通用定时器(TIM2~TIM5)的主要功能:除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM)。
通用定时器的时钟来源;a:内部时钟(CK_INT)b:外部时钟模式1:外部输入脚(TIx)c:外部时钟模式2:外部触发输入(ETR)d:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器通用定时期内部时钟的产生:通用定时器(TIM2-5)的时钟不是直接来自APB1,而是通过APB1的预分频器以后才到达定时器模块。
当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。
PWM输出模式;STM32的PWM输出有两种模式:模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。
区别如下:110:PWM模式1,在向上计数时,一旦TIMx_CNT在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
STM32单片机--PWM输出
STM32单片机--PWM输出采用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指示程序运行上午花了半天时间熟悉了stm32的PWM模块。
中午利用午饭时间把PWM功能调试成功。
当然,很简单的东西,也许很多前辈估计都不屑一顾的东西。
今天最大的感叹就是网络资源实在是个巨大的宝库,真的很庆幸,在这个复杂的社会环境里,在一个到处充斥着私心、私利的时代,各个网站,各个论坛上的众多网友都时刻保持着开源的氛围。
学习一定要和他人交流,而网络提供了这么一个极好的平台。
废话少说,言归正传。
实现功能:采用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指示程序运行。
首先熟悉一下定时器的PWM相关部分。
看图最明白其实PWM就是定时器的一个比较功能而已。
CNT里的值不断++,一旦加到与CCRX寄存器值相等,那么就产生相应的动作。
这点和A VR 单片机很类似。
既然这样,我们要产生需要的PWM信号,就需要设定PWM的频率和PWM 的占空比。
首先说频率的确定。
由于通用定时器的时钟来源是PCLK1,而我又喜欢用固件库的默认设置,那么定时器的时钟频率就这样来确定了,如下:AHB(72MHz)→APB1分频器(默认2)→APB1时钟信号(36MHz)→倍频器(*2倍)→通用定时器时钟信号(72MHz)。
这里为什么是这样,在RCC模块学习记录里有详细记载,不多说。
因此图中的CK_PSC就是72MHz了。
下面的资料也是网上一搜一大把,我就罗列了:STM32的PWM输出有两种模式,模式1(PWM1)和模式2(PWM2),由TIMx_CCMRx。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32的PWM波形输出例程
调试芯片:STM32F103C8T6
外部晶振:8MHz
功能介绍:使用Timer3实现两路(可四路)PWM波形的输出
代码如下:
初始化:系统时钟初始化,GPIO端口初始化,Timer初始化
系统时钟初始化:
1./* 配置系统时钟为72M */
2.SystemInit();
GPIO端口初始化:
1./****************************************************************
2. * 函数名:void GPIO_Config(void)
3. * 描述:配置复用输出PWM时用到的I/O
4. * 输入:无
5. * 输出:无
6. * 调用:main()调用
7. ***************************************************************/
8.void GPIO_Config(void)
9.{
10. GPIO_InitTypeDef GPIO_InitStructure;
11.
12./* GPIOA and GPIOB clock enable */
13. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
14.
15./*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function
push-pull */
16. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
17. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推
挽输出
18. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
19. GPIO_Init(GPIOA, &GPIO_InitStructure);
20.}
Timer初始化:
1./****************************************************************
2. * 函数名:void TIM3_Config(void)
3. * 描述:配置TIM3输出的PWM信号的模式
4. * CH1:输出 T=2.5ms(f=1/2.5ms=400Hz) D=0.6的PWM波(高电平在前,低电
平在后)
5. * CH2:输出 T=2.5ms(f=1/2.5ms=400Hz) D=0.4的PWM波(高电平在后,低电
平在前)
6. * 步骤一:通过T和TIMxCLK的时钟源确定TIM_Period和TIM_Prescaler
7. * T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms
8. * 因为 TIM_Period<65535,所以 TIM_Prescaler>1,
即 TIM_Prescaler=2
9. * 所以 TIM_Period=59999=0xEA5F
10. * 步骤二:根据TIM_Period的值,高低电平的先后D,确定CCR和
TIM_OCPolarity
11. * CH1:因为D=0.6,先高后低;
12. * 所以
CCR1=(TIM_Period+1)* D=36000;TIM_OCPolarity=TIM_OCPolarity_High
13. * CH2:因为D=0.4,先高后低;
14. * 所以
CCR1=(TIM_Period+1)* (1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low
15. * 步骤三:基础寄存器初始化
16. * 步骤四:通道寄存器初始化
17. * 步骤五:使能TIM3重载寄存器ARR
18. * 步骤六:使能TIM3
19. * 输入:无
20. * 输出:无
21. * 调用:main()调用
22. ***************************************************************/
23.void TIM3_Config(void)
24.{
25. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
26. TIM_OCInitTypeDef TIM_OCInitStructure;
27./* PWM信号电平跳变值 */
28. u16 CCR1= 36000;
29. u16 CCR2= 36000;
30./*PCLK1经过2倍频后作为TIM3的时钟源等于72MHz*/
31. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
32./* Time base configuration */
33. TIM_TimeBaseStructure.TIM_Period =0xEA5F;
34. TIM_TimeBaseStructure.TIM_Prescaler = 2;
//设置预分频:预分频=2,即为72/3=24MHz
35. TIM_TimeBaseStructure.TIM_ClockDivision = 0;
//设置时钟分频系数:不分频
36. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数溢出模式
37. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
38./* PWM1 Mode configuration: Channel1 */
39. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//配置为PWM模式1
40. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
41. TIM_OCInitStructure.TIM_Pulse = CCR1;
//设置跳变值,当计数器计数到这个值时,电平发生跳变
42. TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;
//当定时器计数值小于CCR1时为高电平
43. TIM_OC1Init(TIM3, &TIM_OCInitStructure);
//使能通道1
44. TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
45./* PWM1 Mode configuration: Channel2 */
46. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
47. TIM_OCInitStructure.TIM_Pulse = CCR2;
//设置通道2的电平跳变值,输出另外一个占空比的PWM
48. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
//当定时器计数值小于CCR2时为低电平
49. TIM_OC2Init(TIM3, &TIM_OCInitStructure);
//使能通道2
50. TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
51. TIM_ARRPreloadConfig(TIM3, ENABLE);
//使能TIM3重载寄存器ARR
52./* TIM3 enable counter */
53. TIM_Cmd(TIM3, ENABLE);
//使能TIM3
54.}
主函数代码:
1./***************************************************************
2. * 函数名:main
3. * 描述:主函数
4. * 输入:无
5. * 输出:无
6. ***************************************************************/
7.int main(void)
8.{
9. SystemInit();
10. GPIO_Config();
11. TIM3_Config();
12.while (1)
13. {
14.
15. }
16.}
最后上结果图:
疑问:虽然不影响用,但是为什么第一个周期不正确,正确的波形是从第二个周期开始输出的?。