PWM发pwm和脉冲信号,怎么精确控制发pwm和脉冲信号的个数

脉冲宽度控制pwm的工作原理_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
脉冲宽度控制pwm的工作原理
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
你可能喜欢关于STM32输出精确PWM脉冲数的方法? - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 17353|回复: 25
关于STM32输出精确PWM脉冲数的方法?
主题帖子积分
新手上路, 积分 45, 距离下一级还需 5 积分
新手上路, 积分 45, 距离下一级还需 5 积分
在驱动伺服或步进电机的时候,都需要用精确的PWM脉冲数。并且PWM的频率都还挺高,一般100kHz,还可能是多路同时工作,比如驱动4个伺服。
大体看到有两种做法可以实现精确的脉冲数:1,外部再弄个IO口接到PWM脚上,用外部中断的办法,单独来计数。此办法可行,但非常不科学,并且浪费资源。
2,使用定时器,使用一个和PWM频率一致的定时器,使用定时器中断来计数。此方法比第一种办法好了很多,但是仍然感觉比较笨。
STM32的定时器寄存器中有一个重复次数寄存器RCR。
这个寄存器在定时器中可以使用,个人想,若这个重复次数能做到PWM的重复次数计数该多好?
请问大伙,这个能实现吗?或者有不用每个脉冲中断一次的办法实现PWM的精确计数吗?
主题帖子积分
新手上路, 积分 923, 距离下一级还需 -873 积分
新手上路, 积分 923, 距离下一级还需 -873 积分
RE:关于STM32输出精确PWM脉冲数的方法?
for(脉冲数)
IO高电平;延时;IO低电平;延时;
不好意思,发帖的时候点错,接着上面的发
主题帖子积分
金牌会员, 积分 1365, 距离下一级还需 1635 积分
金牌会员, 积分 1365, 距离下一级还需 1635 积分
RE:关于STM32输出精确PWM脉冲数的方法?
RCR是重复次数计数器,如果你想要用这个你必须这样设置,
假设你想要测量的是100PWM周期为一次计数,需要重复计数10次的话:
1、选择TIM1的时钟源为“外部时钟源模式1”;
2、TIM1向上计数,且计数周期为100;
3、重复计数RCR设为10;
4、设置产生UDE更新时中断,你已经测量到100x10=1000个脉冲了。
以前用过STM32的PWM计数,测量发动机转速,都是基于比较捕获引脚的定时器计数或是中断计数,转速快的时候就用计数方式,转速慢的时候就测量周期,也挺好用的,就是中断进的次数多,不过我的项目中处理速度跟转速有关,所以必须进中断。
主题帖子积分
新手上路, 积分 923, 距离下一级还需 -873 积分
新手上路, 积分 923, 距离下一级还需 -873 积分
RE:关于STM32输出精确PWM脉冲数的方法?
直接用单片机的pwm不好控制,我控制步进电机的方法就是用到精确脉冲数,形如:
主题帖子积分
初级会员, 积分 164, 距离下一级还需 36 积分
初级会员, 积分 164, 距离下一级还需 36 积分
RE:关于STM32输出精确PWM脉冲数的方法?
可以选择使用DMA来控制发送的脉冲数,最大可以65535个。如果你的脉冲宽度一致,则DMA地址不增加的方式传输;如果你想使用不同频率,可以设置不同的装载值,PWM使用单次触发。如果你发送的脉冲数超过65535个,则可以使用DMA传输完成中断中切换DMA传输的数据起始地址及发送数量,继续发送。这个方法即方便,又减轻CPU的负担,可以同时驱动多个电机工作,还可以根据电机的启动-运行-停止使用不同的频率。不知道这个方法符不符合你的要求呢。
主题帖子积分
论坛元老, 积分 11151, 距离下一级还需 9988848 积分
论坛元老, 积分 11151, 距离下一级还需 9988848 积分
RE:关于STM32输出精确PWM脉冲数的方法?
你的精确是什么意思?可控吗?
主题帖子积分
新手上路, 积分 45, 距离下一级还需 5 积分
新手上路, 积分 45, 距离下一级还需 5 积分
RE:关于STM32输出精确PWM脉冲数的方法?
精确可控就是: 比如我要输出100kHZ,占空比50%的PWM,发出102个脉冲后,自动停止。
发出的PWM脉冲数是准确的。而不仅仅是频率或占空比。
主题帖子积分
初级会员, 积分 65, 距离下一级还需 135 积分
初级会员, 积分 65, 距离下一级还需 135 积分
回复:关于STM32输出精确PWM脉冲数的方法?
楼主,你好!
请问你实现了吗?
我也急用这个方法,而且最好是一个定时器控制一路,因为我需要6路脉冲。
主题帖子积分
高级会员, 积分 665, 距离下一级还需 335 积分
高级会员, 积分 665, 距离下一级还需 335 积分
我也遇到了上述问题求教
主题帖子积分
金牌会员, 积分 1023, 距离下一级还需 1977 积分
金牌会员, 积分 1023, 距离下一级还需 1977 积分
本帖最后由 王建 于
13:13 编辑
我测试用STM32F103C8发出两路PWM,一路200KHz,另外一路150KHz,这两路频率都是固定的,同时以位置控制的模式(精确个数脉冲)驱动两个伺服电机,还带有USB通讯,没有什么问题。要搞六路的话,还得看资料,换资源多的芯片,六路有点多。DMA方式输出,控制机器人最少8路PWM输出,至少需要8路DMA传输完毕中断。不如上CAN open。
站长推荐 /1
欢迎大家分享基于STM32 Nucleo板的设计方案,社区将提供100套开发板团购,29.9元包邮,更有100-1000元不等的开发经费支持——赶紧来赢取ST MCU社区赞助吧!
Tel: 3-8056
备案号: 苏ICP备号-2
Powered by使用STM32 Timer的Gate模式来精确控制脉冲个数
您好,欢迎来到61ic!
&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&
您现在的位置:&&>>&&>>&&>>&正文
使用STM32&Timer的Gate模式来精确控制脉冲个数
&&&热&&&&&★★★
【字体: 】
使用STM32&Timer的Gate模式来精确控制脉冲个数
作者:&&&&文章来源:&&&&点击数:&&&&更新时间:&&&&
用到了Timer Master Slave中的Gate模式 比如TIM1输出PWM, 频率为F 可以用TIM2通过Gate来控制TIM1的输出 将TIM2预频设为1/(F*2),则TIM2的Period 就是 脉冲个数*2 - 1 /* 1 2 3 4 5 6 7 8 9 __ __ __ __ __ __ __ __ __ | | | | | | | | | | | | | | | | | | TIM1: ___| |__| |__| |__| |__| |__| |__| |__| |__| |____________________ -&| Period1|&- 1) 2) 3) 4) 5) 6) 7) 8) 9) 10)11)12)13)14)15)16)17) __________________________________________________ | | TIM2: ___| |____________________ -&| |&--- Pres2 = Period1/2 |&------------ Period2 = N*2-1 = 17 ------------&| */
软件: IAR 4.42限制版 ST库 2.01 硬件: 万利199开发板 STM3210B-LK1 /*0001*/ /* Includes ------------------------------------------------------------------*/ /*0002*/ #include "stm32f10x_lib.h" /*0003*/ /*0004*/ /* Private typedef -----------------------------------------------------------*/ /*0005*/ /* Private define ------------------------------------------------------------*/ /*0006*/ /* Private macro -------------------------------------------------------------*/ /*0007*/ /* Private variables ---------------------------------------------------------*/ /*0008*/ ErrorStatus HSEStartUpS /*0009*/ /*0010*/ /* Private function prototypes -----------------------------------------------*/ /*0011*/ void RCC_Configuration(void); /*0012*/ void NVIC_Configuration(void); /*0013*/ /* Private functions ---------------------------------------------------------*/ /*0014*/ /*0015*/ #define PWM_Period <FONT color=# /*0016*/ int main(void) /*0017*/ { /*0018*/ u16 waveNumber = <FONT color=#; /*0019*/ /* System Clocks Configuration */ /*0020*/ RCC_Configuration(); /*0021*/ /*0022*/ /* Enable related peripheral clocks */ /*0023*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE); /*0024*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE); /*0025*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1,ENABLE); /*0026*/ RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3,ENABLE); /*0027*/ /*0028*/ /* Config IO for related timers */ /*0029*/ { /*0030*/ GPIO_InitTypeDef GPIO_InitS /*0031*/ /* Timer1 Channel 2, PA9 */ /*0032*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /*0033*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /*0034*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*0035*/ GPIO_Init(GPIOA, &GPIO_InitStructure); /*0036*/ /* Timer3 Channel 4, PB1*/ /*0037*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /*0038*/ GPIO_Init(GPIOB, &GPIO_InitStructure); /*0039*/ } /*0040*/ /* Setup Timer3 channel 4, Timer3 is master timer |*0041*| This timer is used to control the waveform count of timer1 */ /*0042*/ { /*0043*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseS /*0044*/ TIM_OCInitTypeDef TIM_OCInitS /*0045*/ TIM_DeInit(TIM3); /*0046*/ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); /*0047*/ TIM_OCStructInit(&TIM_OCInitStructure); /*0048*/ TIM_TimeBaseStructure.TIM_Prescaler = PWM_Period/<FONT color=# - <FONT color=#; /*0049*/ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*0050*/ TIM_TimeBaseStructure.TIM_Period = waveNumber*<FONT color=#; /*0051*/ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /*0052*/ TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); /*0053*/ /*0054*/ /* Timer2 Channel 3 Configuration in PWM2 mode, this is used for enable Recive clcok */ /*0055*/ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; /*0056*/ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E /*0057*/ TIM_OCInitStructure.TIM_Pulse = waveNumber*<FONT color=# - <FONT color=#; /*0058*/ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H /*0059*/ TIM_OC4Init(TIM3,&TIM_OCInitStructure); /*0060*/ TIM_CtrlPWMOutputs(TIM3, ENABLE); /*0061*/ TIM_SelectOnePulseMode(TIM3, TIM_OPMode_Single); /*0062*/ } /*0063*/ /* Setup timer1 channel 2, Timer1 is slave timer |*0064*| This timer is used to output waveforms */ /*0065*/ { /*0066*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseS /*0067*/ TIM_OCInitTypeDef TIM_OCInitS /*0068*/ TIM_DeInit(TIM1); /*0069*/ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); /*0070*/ TIM_OCStructInit(&TIM_OCInitStructure); /*0071*/ TIM_TimeBaseStructure.TIM_Prescaler = <FONT color=#; /*0072*/ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*0073*/ TIM_TimeBaseStructure.TIM_Period = PWM_P /*0074*/ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /*0075*/ TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); /*0076*/ /*0077*/ /* Timer2 Channel 3 Configuration in PWM2 mode, this is used for enable Recive clcok */ /*0078*/ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; /*0079*/ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_E /*0080*/ TIM_OCInitStructure.TIM_Pulse = PWM_Period/<FONT color=#; /*0081*/ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_H /*0082*/ TIM_OC2Init(TIM1,&TIM_OCInitStructure); /*0083*/ TIM_CtrlPWMOutputs(TIM1, ENABLE); /*0084*/ } /*0085*/ /* Create relationship between timer1 and timer3, timer3 is master, timer1 is slave |*0086*| timer1 is work under gate control mode, and controled by timer3 |*0087*| timer3's channel 4 is used as the control signal |*0088*| */ /*0089*/ /* Enable timer's master/slave work mode */ /*0090*/ TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable); /*0091*/ TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable); /*0092*/ /* timer3's channel 4 is used as the control signal */ /*0093*/ TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_OC4Ref ); /*0094*/ /* Check the master/slave is valid or not */ /*0095*/ ((u16)GetInternalTrigger(TIM1,TIM3) != (u16)<FONT color=#); /*0096*/ /* Config timer1's external clock */ /*0097*/ TIM_ITRxExternalClockConfig(TIM1, (TIM1,TIM3)); /*0098*/ TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Gated); /*0099*/ /*0100*/ /* Enable the slave tiemr*/ /*0101*/ TIM_Cmd(TIM1,ENABLE); /*0102*/ //SetupAlltimers(); /*0103*/ while(<FONT color=#){ /*0104*/ /* Check whether the previous action is done or not */ /*0105*/ if(!(TIM3-&CR1 & <FONT color=#)){ /*0106*/ TIM1-&CNT = <FONT color=#; /* It would be very perfect if gate mode can |*0107*| reset the slave timer automatically */ /*0108*/ TIM3-&ARR = waveNumber*<FONT color=#; /* Reload wave number*/ /*0109*/ TIM3-&CCR4 = waveNumber*<FONT color=# - <FONT color=#; /*0110*/ TIM3-&CR1|=<FONT color=#; /* Re-enable the timer */ /*0111*/ /* update waveform number */ /*0112*/ waveNumber++; /*0113*/ if(waveNumber == <FONT color=#){ /*0114*/ waveNumber = <FONT color=#; /*0115*/ } /*0116*/ } /*0117*/ } /*0118*/ } /*0119*/ /*0120*/ /******************************************************************************* |*0121*| * Function Name : RCC_Configuration |*0122*| * Description : Configures the different system clocks. |*0123*| * Input : None |*0124*| * Output : None |*0125*| * Return : None |*0126*| *******************************************************************************/ /*0127*/ void RCC_Configuration(void) /*0128*/ { /*0129*/ /* RCC system reset(for debug purpose) */ /*0130*/ RCC_DeInit(); /*0131*/ /*0132*/ /* Enable HSE */ /*0133*/ RCC_HSEConfig(RCC_HSE_ON); /*0134*/ /*0135*/ /* Wait till HSE is ready */ /*0136*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /*0137*/ /*0138*/ if(HSEStartUpStatus == SUCCESS) /*0139*/ { /*0140*/ /* Enable Prefetch Buffer */ /*0141*/ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /*0142*/ /*0143*/ /* Flash 2 wait state */ /*0144*/ FLASH_SetLatency(FLASH_Latency_2); /*0145*/ /*0146*/ /* HCLK = SYSCLK */ /*0147*/ RCC_HCLKConfig(RCC_SYSCLK_Div1); /*0148*/ /*0149*/ /* PCLK2 = HCLK */ /*0150*/ RCC_PCLK2Config(RCC_HCLK_Div1); /*0151*/ /*0152*/ /* PCLK1 = HCLK/2 */ /*0153*/ RCC_PCLK1Config(RCC_HCLK_Div2); /*0154*/ /*0155*/ /* PLLCLK = 8MHz * 9 = 72 MHz */ /*0156*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /*0157*/ /*0158*/ /* Enable PLL */ /*0159*/ RCC_PLLCmd(ENABLE); /*0160*/ /*0161*/ /* Wait till PLL is ready */ /*0162*/ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) /*0163*/ { /*0164*/ } /*0165*/ /*0166*/ /* Select PLL as system clock source */ /*0167*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*0168*/ /*0169*/ /* Wait till PLL is used as system clock source */ /*0170*/ while(RCC_GetSYSCLKSource() != <FONT color=#x08) /*0171*/ { /*0172*/ } /*0173*/ } /*0174*/ }
效果如下图
文章录入:admin&&&&责任编辑:admin&
上一篇文章: 下一篇文章:
【】【】【】【】【】
  网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
PWM脉冲控制的晶闸管触发装置.pdf4页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:50 &&
你可能关注的文档:
··········
··········
第28卷第 1期
湖 南 工 业 大 学 学 报
Vo1.28 NO.1
2014年 1月
JournalofHunanUniversityofTechnology
doi:10.3969/j.issn..0
PWM脉冲控制的晶闸管触发装置
陈 欢,凌 云,李 飞,彭琼林
湖南工业大学 电气与信息工程学院,湖南 株洲 412007
摘 要:为解决传统晶闸管触发装置的一系列问题,设计了一种新型PWM脉冲控制的晶闸管触发装置。
该装置由5个部分构成:晶闸管双向电子开关、负载、过零脉冲产生及直流稳压单元、触发信号产生单元、
控制信号给定单元。双向晶闸管作为双向电子开关,cM0S非门作为移相控制单元的核心器件,其阁值电压
直接作为触发基准电压,利用PWM信号进行移相控制。测试结果表明,该装置具有较好的抗干扰性能和良
好的移相控制线性度 ,且成本低 ,体积小,工作稳定可靠。
关键词:PWM ;移相触发脉冲 ;晶闸管;触发器
中图分类号 :TM930
文献标志码 :A
文章编号 :14 01-0049-04
ThePWM PulseControlledThyristorTriggerDevice
ChenHuan,LinYun,LiFei,PengQionglin
SchoolofElectricalandInformationEngineering,HunanUniversityofTechnology,ZhuzhouHunan412007,China
Abstract:Inordertosolveaseriesofproblemsoftraditionalthyristortriggerdevice,anewthyristortriggerdevice
controlledbyPWM pulsewasdesigned.Thedeviceconsistedoffivepartedoftwo―waythyristorelecrtonicswitches,load,
zeropulsegenerationandDCvoltageunit,triggersignalgeneratingunitandconrtolsignal givenunit.Takingthebidirec―
tionalthyristorastwo?wayelectronicswitch,CMOSnotgateasthecoreofp
正在加载中,请稍后...您的位置: >
脉冲宽度控制pwm的工作原理和
 1 脉冲宽度控制pwm的工作原理
PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。   PWM控制技术在逆变电路中应用最广,应用的逆变电路绝大部分是PWM型,PWM控制技术正是有赖于在逆 变电路中的应用,才确定了它在电力电子技术中的重要地位。  理论基础:    冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。
&&&&&&&&      图1 形状不同而冲量相同的各种窄脉冲 面积等效原理:   分别将如图1所示的电压窄脉冲加在一阶惯性环节(R-L电路)上,如图2a所示。其输出电流i(t)对不同窄脉冲时的响应波形如图2b所示。从波形可以看出,在i(t)的上升段,i(t)的形状也略有不同,但其下降段则几乎完全相同。脉冲越窄,各i(t)响应波形的差异也越小。如果周期性地施加上述脉冲,则响应i(t)也是周期性的。用傅里叶级数分解后将可看出,各i(t)在低频段的特性将非常接近,仅在高频段有所不同。
        图2 冲量相同的各种窄脉冲的响应波形   用一系列等幅不等宽的脉冲来代替一个正弦半波,正弦半波N等分,看成N个相连的脉冲序列,宽度相等,但幅值不等;用矩形脉冲代替,等幅,不等宽,中点重合,面积(冲量)相等,宽度按正弦规律变化。 SPWM波形——脉冲宽度按正弦规律变化而和正弦波等效的PWM波形。
       图3 用PWM波代替正弦半波   要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。 PWM电流波: 电流型逆变电路进行PWM控制,得到的就是PWM电流波。 PWM波形可等效的各种波形: 直流斩波电路:等效直流波形 SPWM波:等效正弦波形,还可以等效成其他所需波形,如等效所需非正弦交流波形等,其基本原理和SPWM控制相同,也基于等效面积原理。
PWM(脉冲宽度调制Pulse Width Modulation)原理:&&&&&&& 脉冲宽度调制波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。图1所示为脉冲宽度调制系统的原理框图和波形图。该系统有一个比较器和一个周期为Ts的锯齿波发生器组成。语音信号如果大于锯齿波信号,比较器输出正常数A,否则输出0。因此,从图1中可以看出,比较器输出一列下降沿调制的脉冲宽度调制波。&&&&&&& 通过图1b的分析可以看出,生成的矩形脉冲的宽度取决于脉冲下降沿时刻t k时的语音信号幅度值。因而,采样值之间的时间间隔是非均匀的。在系统的输入端插入一个采样保持电路可以得到均匀的采样信号,但是对于实际中tk-kTs&&Ts的情况,均匀采样和非均匀采样差异非常小。如果假定采样为均匀采样,第k个矩形脉冲可以表示为:&&&&&&&&&&&&&&&&&&&&&&&&&&&
(1)其中,x&#123;t&#125;是离散化的语音信号;Ts是采样周期;&是未调制宽度;m是调制指数。&然而,如果对矩形脉冲作如下近似:脉冲幅度为A,中心在t = k Ts处,& 在相邻脉冲间变化缓慢,则脉冲宽度调制波xp(t)可以表示为:&&&&&&&&&&&&&&&&&&&&&&&&&&&
(2)其中,& 。无需作频谱分析,由式(2)可以看出脉冲宽度信号由语音信号x(t)加上一个直流成分以及相位调制波构成。当& 时,相位调制部分引起的信号交迭可以忽略,因此,脉冲宽度调制波可以直接通过低通滤波器进行解调。
非常好我支持^.^
不好我反对
相关阅读:
( 发表人:admin )
评价:好评中评差评
技术交流、我要发言
发表评论,获取积分! 请遵守相关规定!提 交
Copyright &
.All Rights Reserved

我要回帖

更多关于 脉冲和pwm区别 的文章

 

随机推荐