PWM发脉冲,怎么精确控制发脉冲的个数呢精编版
- 格式:doc
- 大小:509.50 KB
- 文档页数:9
pwm波控制原理小伙伴!今天咱们来唠唠这个超有趣的PWM波控制原理呀。
你可以把PWM波想象成一个超级调皮的小魔法师,它总是在那里变来变去地控制各种东西呢。
PWM全称是脉冲宽度调制(Pulse Width Modulation)。
简单来说呀,它就是一种对脉冲信号进行处理的方式。
咱们先来说说这个脉冲信号是啥。
脉冲信号就像是一个会突然冒出来又突然消失的小精灵。
它有高电平和低电平两种状态,就好像小精灵一会儿蹦得高高的(高电平),一会儿又蹲得低低的(低电平)。
PWM波呢,就是在这个脉冲信号的基础上玩花样。
PWM波的核心魔法就是改变脉冲的宽度啦。
你看啊,就像我们画长方形,有长有短一样,PWM波的脉冲宽度也是可以变来变的。
这个脉冲宽度可不得了哦。
比如说我们有一个小灯,它就像是一个听话的小宠物。
如果我们用普通的电直接给它供电,它就只会一直亮着,没啥花样。
但是呢,当我们用PWM波来控制它的时候,就像是给这个小灯的供电施了魔法。
当PWM波的脉冲宽度比较宽的时候,就好像是给小灯喂了很多能量,小灯就会很亮。
这就好比你给小宠物喂了好多好吃的,它就特别有活力。
可是呢,当PWM波的脉冲宽度变窄了,就像是克扣了小灯的能量,小灯就会暗下来,就像小宠物没吃饱有点蔫儿了。
在实际的电路里面,PWM波就像是一个超级指挥官。
它可以控制电机的转速哦。
电机就像是一个勤劳的小工人,PWM波告诉电机什么时候该快转,什么时候该慢转。
如果PWM波的脉冲宽度宽,电机就像打了鸡血一样,呼呼地快速转起来;要是脉冲宽度窄呢,电机就慢悠悠地转,就像小工人偷懒啦。
而且呀,PWM波控制还很节能呢。
你想啊,如果我们要让一个设备在不同的功率下工作,要是用传统的方法,可能就得不断地调整电压或者电流,就像搬东西的时候一会儿用大卡车(高电压大电流),一会儿用小推车(低电压小电流),换来换去可麻烦了。
但是PWM波就聪明啦,它只需要改变脉冲宽度,就像是调整大卡车每次运货的多少,这样既可以达到不同的工作效果,又不会浪费太多能量。
该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。
本文为第一讲,开始介绍S12 MCU的PWM模块。
PWM 调制波有8个输出通道,每一个输出通道都可以独立的进行输出。
每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器、一个占空比选择寄存器和两个可供选择的时钟源。
每一个P WM 输出通道都能调制出占空比从0—100% 变化的波形。
PWM 的主要特点有:1、它有8个独立的输出通道,并且通过编程可控制其输出波形的周期。
2、每一个输出通道都有一个精确的计数器。
3、每一个通道的P WM 输出使能都可以由编程来控制。
4、PWM 输出波形的翻转控制可以通过编程来实现。
5、周期和脉宽可以被双缓冲。
当通道关闭或PWM 计数器为0时,改变周期和脉宽才起作用。
6、8 字节或16 字节的通道协议。
7、有4个时钟源可供选择(A、SA、B、SB),他们提供了一个宽范围的时钟频率。
8、通过编程可以实现希望的时钟周期。
9、具有遇到紧急情况关闭程序的功能。
10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。
1、PWM启动寄存器PWMEPWME 寄存器每一位如图1所示:复位默认值:0000 0000B图1 PWME 寄存器每一个PWM 的输出通道都有一个使能位P WMEx 。
它相当于一个开关,用来启动和关闭相应通道的PWM 波形输出。
当任意的P WMEx 位置1,则相关的P WM 输出通道就立刻可用。
用法:PWME7=1 --- 通道7 可对外输出波形PWME7=0 --- 通道7 不能对外输出波形注意:在通道使能后所输出的第一个波形可能是不规则的。
当输出通道工作在串联模式时(PWMCTL 寄存器中的CONxx置1),那么)使能相应的16位PWM 输出通道是由PWMEx 的高位控制的,例如:设置PWMCTL_CON01 = 1,通道0、1级联,形成一个16位PWM 通道,由通道 1 的使能位控制PWM 的输出。
STM32:F103F407定时器主从模式输出精准脉冲个数项目中需要对步进电机进行较为精准的控制。
经过查找资料,可以通过对STM32的定时器采用主从定时器的模式。
由主定时器输出方波信号,从定时器对主定时器输出的脉冲进行计数,溢出时触发从定时器的中断服务函数。
以此达到控制步进电机转动的圈数的目的。
本文所采用的STM32开发板是正点原子的STM32F103(精英板)、STM32F407(探索者),参考资料多来自正点原子资料下载中心(/docs/index.html)。
我依然处于刚入门学习STM32的阶段,程序是在正点原子的例程的基础上修改的。
原理/思路•步进电机:步进电机需要通过步进驱动器进行驱动,STM32通过串口输出一定频率的PWM波信号给步进电机驱动器的脉冲输入引脚(如PU-),输出高低电平给步进电机驱动器的方向控制信号输入引脚(如DR-)。
•脉冲数与圈数:我使用的是一般的两相四线步进电机,步距角为1.8°。
由此可知,360°/1.8°=200;也就是说,在不细分的情况下,200个脉冲使步进电机转动一圈。
如果设置PWM波输出频率为 1kHz,也就使一秒内输出1000个脉冲,相当于步进电机一秒内可以转动5圈。
•主从定时器:主定时器输出PWM波脉冲信号,从定时器对主定时器输出的脉冲进行计数。
对于STM32,除了基本定时器,高级定时器和通用定时器都可以分别作为主、从定时器,但其中的主从关系要遵循参考手册中所提供的配置。
下图,表74,表78,来自《STM32中文参考手册》P237,P285;适用于STM32F103。
下图,表72,表79,来自《STM32F4xx中文参考手册》P370,P464;适用于STM32F407。
•注意:由上表可知,对于STM32F103,最多三组主从定时器;对于STM32F407,最多四组主从定时器。
TS值 - ITRx 不能重复使用,定时器也不可重复使用。
现代电力电子及变流技术第四章脉宽调制(PWM)技术脉宽调制技术:按同一比例改变在ur 和uc交点时刻控制IGBT 的通断u r 和uc的点时刻制IGBT 的通断控制公用三角波载波uc 三相的调制信号依次u c u rW单相逆变器结构特点电路结构特征:2个桥臂输出电压:ab ag bg V V V =−结构分析:�每个桥臂存在2个开关状态—桥臂上开关通(用S a =1描述);—桥臂下开关通(用S a =0描述)。
�逆变器共有4种开关状态—S a S b :00,01,10,11。
开关状态与电压的关系4.5 4.5 SVPWMSVPWM 的原理及实现结构特点�两个桥臂电压V ag 和V bg 分别独立可控——控制存在两个自由度;�由于连接了负载,输出电压V ab 具有唯一性——只有一个自由度。
如何分析两维的桥臂电压和一维的输出电压之间的联系?几何分析方法矢量空间�桥臂电压构成两维空间,两个自由度分别代表两个垂直方向——桥臂电压空间;�输出电压只有一个自由度,构成一维空间 ——输出电压空间。
4.5 4.5 SVPWMSVPWM 的原理及实现桥臂电压和输出电压的联系�采用投影方式建立联系;�开关状态(00),(11)形成的两个桥臂电压——对应一个输出电压(0V)。
这一投影具有唯一性投影关系ag ab bg 01111V V V V −⎡⎤⎡⎤⎡⎤=⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦V 0是零序电压*11ag 22ab 11bg 220*V V V V ⎡⎤⎡⎤⎡⎤=⎢⎥⎢⎥⎢⎥−⎣⎦⎣⎦⎣⎦逆变器控制方法V 0*为一定范围的任意数注:V 0*取常数(如V i )时,Vag 和Vbg 的驱动波形可以设计。
例:V ab *取0.5V i , V 0*取V iV ag 取0.75V i , V bg 取0.25V ia 桥臂上管b 桥臂下管b 桥臂上管a 桥臂下管4.5 4.5 SVPWMSVPWM 的原理及实现V 0*取其他值会怎样? V 0*有没有一个取值原则?4.5 4.5 SVPWMSVPWM 的原理及实现三相逆变器结构特点结构特征:3个桥臂电路特征:()ng ag bg cg 3V V V V =++结构分析:�每个桥臂存在2个开关状态—桥臂上开关通(用S a =1描述);—桥臂下开关通(用S a =0描述)。
pwm的具体原理
PWM(脉宽调制)是一种采用脉冲的宽度来调制信号的技术。
其基本原理是通过改变脉冲的宽度,从而改变信号的平均功率。
在PWM的实现过程中,主要包括以下几个步骤:
1. 设定基准信号:首先需要确定一个基准信号,即频率固定、幅度一致的连续周期信号,可以是正弦波、方波等。
该信号的周期决定了PWM信号的刷新频率。
2. 设定调制信号:接下来需要确定一个调制信号,即用于改变基准信号脉冲宽度的信号。
调制信号通常是一个较低频率的信号,其幅度表示要控制的参数的大小。
3. 比较器运算:比较器会不断地将调制信号与基准信号进行比较,当基准信号的值高于调制信号时,输出高电平,当基准信号的值低于调制信号时,输出低电平。
4. 设置脉宽:根据比较器的输出,可以确定脉冲宽度。
当调制信号较大时,比较器输出的高电平时间较长,脉冲宽度增大;当调制信号较小时,比较器输出的高电平时间较短,脉冲宽度减小。
5. 输出PWM信号:经过调整后的脉冲宽度被用来控制目标器件,例如直流电机、电子元件等。
PWM信号具有周期性、平
均功率可控的特点,可以精确地控制目标设备的工作状态。
需要注意的是,由于PWM信号是由一系列高低电平的脉冲组
成的,所以其平均值表示的不是直流电压或电流的实际大小,而是平均功率的调节。
因此,在使用PWM进行控制时,需要目标器件能够接受PWM信号并进行相应的处理,以实现对参数的精确调节。
01 什么是PWM脉冲宽度调制(PWM),PWM全称Pulse Width Modulation,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
PWM的频率:是指1秒钟内信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期。
单位:Hz表示方式:50Hz、100HzPWM的周期:T=1/f(周期=1/频率)50Hz=20ms 一个周期,如果频率为50Hz,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期。
占空比:是一个脉冲周期内,高电平的时间与整个周期时间的比例。
单位:%(0%-100%)表示方式:20%周期:一个脉冲信号的时间,1s内测周期次数等于频率。
脉宽时间:高电平时间。
上图中脉宽时间占总周期时间的比例,就是占空比。
比方说周期的时间是10ms,脉宽时间是8ms,那么低电平时间就是2ms,总的占空比 8/(8+2)=80%,这就是占空比为80%的脉冲信号。
而我们知道PWM就是脉冲宽度调制通过调节占空比,就可以调节脉冲宽度(脉宽时间),而频率,就是单位时间内脉冲信号的次数。
以20Hz,占空比为80%举例,就是1秒钟之内输出了20次脉冲信号,每次的高电平时间为40ms。
我们换更详细点的图:上图中,周期为T,T1为高电平时间,T2为低电平时间,假设周期T为1s,那么频率就是1Hz,那么高电平时间0.5s,低电平时间0.5s,总的占空比就是0.5 /1 =50%。
02 PWM原理以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平,假设高电平为5V,低电平则为0V,那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号。
我们知道,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。
什么是PWM脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
pwm的频率:是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期单位:Hz表示方式: 50Hz 100Hzpwm的周期:T=1/f周期=1/频率50Hz = 20ms一个周期如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期占空比:是一个脉冲周期内,高电平的时间与整个周期时间的比例单位:%(0%-100%)表示方式:20%周期:一个脉冲信号的时间1s内测周期次数等于频率脉宽时间:高电平时间上图中脉宽时间占总周期时间的比例,就是占空比。
比方说周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms 总的占空比 8/8+2= 80%。
这就是占空比为80%的脉冲信号。
而我们知道PWM就是脉冲宽度调制通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率就是单位时间内脉冲信号的次数,频率越大。
以20Hz 占空比为80% 举例就是1秒钟之内输出了20次脉冲信号每次的高电平时间为40ms我们换更详细点的图上图中,周期为TT1为高电平时间T2 为低电平时间假设周期T为 1s 那么频率就是 1Hz 那么高电平时间0.5s ,低电平时间0.5s 总的占空比就是 0.5 /1 =50%PWM原理以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。
假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号。
我们知道,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。
PWM(脉冲宽度调制)的分辨率(Resolution)是指最小的时间单位,即在一个完整的脉冲周期内可以区分的时间段数量。
通常,分辨率越高,PWM信号的精度和准确性就越高。
计算PWM的分辨率,需要了解PWM的频率和周期。
一般来说,PWM的频率是指单位时间内脉冲的个数,周期则是指一个完整的脉冲信号所持续的时间。
PWM的分辨率可以通过以下公式计算:
分辨率= 1 / 周期
这个公式表明,分辨率与周期成反比,即周期越长,分辨率越低;反之,周期越短,分辨率越高。
例如,如果一个PWM信号的频率为1000Hz(即每秒钟产生1000个脉冲),周期为1ms(即每个脉冲信号持续时间为1毫秒),则其分辨率为:
分辨率= 1 / 1ms = 1000
这意味着该PWM信号的最小时间单位为1000个时间单位,即每个时间单位对应于一个完整的脉冲周期的1/1000。
PWM基本原理及其实现方法PWM(脉宽调制)是一种常用的控制电子设备的方法,通过调整电信号的脉冲宽度来控制电信号的平均功率。
PWM的基本原理是通过改变信号的占空比来实现对设备的控制。
PWM实现的基本步骤是:先产生一个固定频率的正弦波信号(一般采用震荡器或定时器),然后通过比较器对正弦波信号与参考电平进行比较,根据比较结果来产生脉冲信号。
具体来说,PWM的实现方法有以下几种:1. 单脉冲宽度调制(Single Pulse Width Modulation):这种方法是最简单直接的方式,通过控制脉冲信号的宽度来实现对设备的控制。
宽度越大,输出功率越大,宽度越小,输出功率越小。
2. 多脉冲宽度调制(Multiple Pulse Width Modulation):该方法是在单脉冲宽度调制的基础上,引入多个脉冲,通过调整各个脉冲的宽度和间隔,实现更精细的控制。
例如,可以通过改变每个脉冲的宽度来实现设备的加速和减速。
3. 脉冲位置调制(Pulse Position Modulation):与脉冲宽度调制不同,该方法是通过改变脉冲信号的位置来控制设备的平均功率。
脉冲信号的位置决定了信号的相位,从而控制了输出功率。
4. 脉冲频率调制(Pulse Frequency Modulation):该方法是通过改变脉冲信号的频率来控制设备的平均功率。
频率越高,平均功率越高,频率越低,平均功率越低。
以上四种方法都是基于对脉冲信号的宽度、位置或频率进行调制,从而实现对设备的控制。
这些方法广泛应用于各种电子设备的控制,例如模拟调制器、电机速度控制器、灯光调光器等。
总结起来,PWM通过改变脉冲信号的宽度、位置或频率来实现对设备的平均功率控制。
根据需求不同,可以选择不同的PWM实现方法。
由于PWM具有高效、精度高的特点,所以被广泛应用于各种电子设备的控制中。
……………………………………………………………最新资料推荐………………………………………………… 1 STM32的PWM发送脉冲,周期和脉宽都可调了,但是现在不知道如何精确的控制所发的脉冲个数。 具体要求就是在一段时间内大概50ms内发送5000-1W个脉冲 个数要很精确,误差2个以内可以接受 该怎么控制呢? 1.接上一个外部中断口,在中断中计数 2.用一个定时器 对发脉冲的时间进行控制
各位大侠还有什么好的办法吗?求解啊!
PWM溢出中断计数,是个不错的解决办法。 如果一个上升沿算一个脉冲的话,控制周期(频率)不就行了 开启PWM输出的溢出中断,进入一次中断,就是一个波
原子哥 是这里吗? 设置这个寄存器 或者只是简单的定时器溢出中断 oid TIM3_IRQHandler(void) { if(TIM3->SR&0X0001)//溢出中断 ……………………………………………………………最新资料推荐………………………………………………… 2 { .... //计数 } TIM3->SR&=~(1<<0);//清除中断标志位 }
看我们开发板:定时器中断例程。
你好 原子哥 中断计数的话 那怎么停止呢 还有停止了还想让他循环发送呢 有没有实现好的源程序呢 我是STM32F103
控制输出方波的脉冲数和周期 好多人遇到这个问题,额! 现在我用了两种方法实现,感觉都不好! 方案1:定时器翻转IO,到达指定个数关闭TIM 方案2:PWM,开启比较捕获中断,到达指定个数关闭TIM
感觉都是频繁进中断,占用大量CPU资源。不能做其他事了 void TIM4_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure;
/* TIM4 clock enable */ //PCLK1经过2倍频后作为TIM4的时钟源等于72MHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); NVIC_Configuration(1);
/* GPIOB clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
/*GPIOB Configuration: TIM4 channel 1 and 2 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 ……………………………………………………………最新资料推荐………………………………………………… 3 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); }
void Tim2_Slave_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM2); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); NVIC_Configuration(8); TIM_TimeBaseStructure.TIM_Period= XBUF[1] - 1; TIM_TimeBaseStructure.TIM_Prescaler= 0; //时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivision=0; //采样分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);//选择TIM2的输入触发源 内部触发3 TIM4 TIM_InternalClockConfig(TIM2); TIM2->SMCR |= 0x0007;//设定从模式控制寄存器,外部时钟模式1 上升沿驱动计数
//TIM_UpdateDisableConfig(TIM4,ENABLE); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除溢出中断标志 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2,ENABLE);//是否开启时钟(开启后每发送一个脉冲,定时器加一)
} void Tim3_Slave_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); NVIC_Configuration(9);
TIM_TimeBaseStructure.TIM_Period= XBUF[3] - 1; ……………………………………………………………最新资料推荐………………………………………………… 4 TIM_TimeBaseStructure.TIM_Prescaler= 0; //时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivision=0; //采样分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3);//选择TIM2的输入触发源 内部触发3 TIM4 TIM_InternalClockConfig(TIM3); TIM3->SMCR |= 0x0007;//设定从模式控制寄存器,外部时钟模式1 上升沿驱动计数
//TIM_UpdateDisableConfig(TIM4,ENABLE); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_ClearFlag(TIM3,TIM_FLAG_Update); //清除溢出中断标志 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); TIM_Cmd(TIM3,ENABLE);//是否开启时钟(开启后每发送一个脉冲,定时器加一)
} /* * 函数名:TIM4_Mode_Config * 描述 :配置TIM4输出的PWM信号的模式,如周期、极性、占空比 * 输入 :无 * 输出 :无 * 调用 :内部调用 */ void TIM4_PWM_Init(u16 T) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure;
u16 CCR1_Val = (T+1)/2; u16 CCR2_Val = (T+1)/2; u16 CCR3_Val = (T+1)/2; u16 CCR4_Val = (T+1)/2; /* ----------------------------------------------------------------------- ……………………………………………………………最新资料推荐………………………………………………… 5 TIM1 Configuration: generate 4 PWM signals with 4 different duty cycles: TIM1CLK = 36 MHz, Prescaler = 0x0, TIM1 counter clock = 36 MHz TIM1 ARR Register = 999 => TIM1 Frequency = TIM1 counter clock/(ARR + 1) TIM1 Frequency = 36 KHz. TIM1 Channel1 duty cycle = (TIM1_CCR1/ TIM1_ARR)* 100 = 50% TIM1 Channel2 duty cycle = (TIM1_CCR2/ TIM1_ARR)* 100 = 50% TIM1 Channel3 duty cycle = (TIM1_CCR3/ TIM1_ARR)* 100 = 50% TIM1 Channel4 duty cycle = (TIM1_CCR4/ TIM1_ARR)* 100 = 50% ----------------------------------------------------------------------- */
/* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = T-1;//T us TIM_TimeBaseStructure.TIM_Prescaler = 72-1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM4->CR1 &= ((u16)0x03FD);// UDIS enable /* PWM1 Mode configuration: Channel1 */ 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;