PLC的高速脉冲是怎样练成的
众所周知,一般PLC可发出10-10000Hz的脉冲信号.我打算用AVR来实现这个功能.用MEGA168的TIMER1,工作于CTC模式,比较匹配时OC1A切换电平状态,同时中断进行已经脉冲数量计数并判断.以1000Hz发1000个脉冲为例得到以下程序并测试成功.感觉用这种方法存在以下问题,请高手指导.问题1,无法精确产生1Hz为间隔的脉冲频率,如产生10001Hz的频率.
问题2,当为了通讯要采用14.7456M的晶体时,更没法得到整数频率输出.
问题3,当输出10000HZ时每隔50us即产生一次中断,以下的中断程序耗时约5us(AVRSTUDIO).真正工作时,有没有实用性.
问题4,还有其他方法么?
// Declare your global variables here
bit plus_busy,plus_complete; //发送中,发送完成
unsigned long int plus_sv;plus_pv;//设定发送数量,已经发送数量
// Timer 1 output compare A interrupt service routine
interrupt void timer1_compa_isr(void)
{
// Place your code here
if(!PINB.1)//脉冲输出低电平
{
if((++plus_pv)>=plus_sv)
{
plus_complete = 1;
plus_busy = 0;
TCCR1B = 0x0;//停止TIMER1
}
}
}
void main(void)
{
// Declare your local variables here
bit temp;
// Timer/Counter 1 initialization
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x40;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x7C;
OCR1BH=0x00;
OCR1BL=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
if(!plus_busy)
{
if(PINC.0 && (!temp))//单次有效,PINC.0起动脉冲
{
// Clock source: System Clock
// Clock value: 125.000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Toggle
// OC1B output: Discon.
plus_sv = 1000;
plus_pv = 0x0;
TCNT1H=0x00;
TCNT1L=0x00;
TCCR1B=0x0B;
plus_complete = 0;
plus_busy = 1;
}
}
temp = PINC.0;
};
} 用CPLD+AVR即可产生100K的脉冲串! 能限定脉冲的数量么 我用普通的MCU按照DDS原理就可以产生1HZ~100KHZ的脉冲,步进1HZ,不过在输出50KHZ以上时,有一点点抖动,这是DDS原理造成的 m....ar....k 记号下…………… 记号下 coody,你好!能否简要说下DDS,百度一下,感觉不得要领 DDS原理简介(中文):http://www.docin.com/p-503926.html
实用信号源的设计和制作(实验指导)直接数字合成(DDS).pdfourdev_509761.pdf(文件大小:212K) (原文件名:实用信号源的设计和制作(实验指导)直接数字合成(DDS).pdf) PLC的高速脉冲一般用来控制伺服系统或步进系统,脉冲频率正比于转速,脉冲数量正比于转角.DDS完成的信号源能完成以上控制么. 是不是弄到真东西的时候,交流就有些问题 脉冲频率无所谓的,100hz加速到1000hz,你以为就是100-101-102.。。。-999-1000hz吗?还dds呢,首先,驱动器接收脉冲,101和100就没区别。只要分段加速,驱动器就没问题,现在的驱动器都很厉害。我的应用,分成20段加减速。在伺服和步进驱动器都测试过,上述提出dds加速的,你们做信号行。但是PLC这个东西,能省时间最好。三菱fx2n也是分段加速的,可以看手册提示。老的脉冲输出方案用cpld是没办法。现在新的CPU,大可以用内部定时器来做脉冲输出(我实践过200K高速脉冲输出,2轴,并且不影响PLC执行周期)。
当然做运动控制时候,做多轴插补,cpld是不可少的。 1.对于lz位的问题1,2.我觉得是讨论厨师给猪做饭的问题。现在不讲究做的好还是差,关键是对象不需要这么高精度的脉冲源。你的频率100-150hz,对驱动器来说无所谓。
2.avr做这种控制,心有余而力不足。早点换芯片吧,stm32(理由1:位控制,2.timer强,但是要注意用法3.ab相输入,ab相脉冲输出都可以实现)。 我的工作是plc做些设备控制的,PLC的脉冲输出频率是10~10000Hz任意可调的.当我用AVR来实现这一功能时,就觉得存以上的问题.
我用的PLC主控MCU为H8@25M,并没有CPLD/FPGA,这样能实现6路10KHz高速计数,2路10KHz高速脉冲输出,并且可以开两个通讯口,最高通讯波特率达115.2K,以上10样任务均隔100us产生一中断(并不一定是中断),假定这种中断是以相同的间隔产生,则MCU每隔10us就要被中断一次,他还能干些其他的活吗? 建议还是换硬件。照你的这个,就算实现也是问题。 以前我们用H8-2357,两路高速计数单相(2 timer) 两路高速输出(4 timer(2路做pwm输出,2路做脉冲计数/调速/截止))。
你上面的规格是不是太多了。要是必须得这样还是建议加CPLD吧。 看来台达PLC的研发人员还是相当厉害 实际上PLC输出频率的分辨率真能够达到1HZ吗?十分怀疑中。楼主有条件可以检测检测。我估计是不能的。 回复【17楼】whirlyx
实际上plc输出频率的分辨率真能够达到1hz吗?十分怀疑中。楼主有条件可以检测检测。我估计是不能的。
-----------------------------------------------------------------------
说的对,PLC的时钟频率一般在50M左右,输出频率越高分辨率越低!! 回复【16楼】junmadianzi
-----------------------------------------------------------------------
为什么说台达厉害?那位是台达的? 三菱FX1S的脉冲指令我做过测试,步进1hz,最高是200KHZ 西门子的224XP与226好像也是200K 本帖最后由 vlog_user 于 2012-4-12 11:37 编辑
原内容删除,低调 本帖最后由 vlog_user 于 2012-4-12 15:12 编辑
tsb0574 发表于 2010-9-14 17:17 static/image/common/back.gif
回复【17楼】whirlyx
实际上plc输出频率的分辨率真能够达到1hz吗?十分怀疑中。楼主有条件可以检测检测。 ...
一般做法,脉冲速度只能为的频率周期的整数倍,假如CPU/CPLD/ASIC主频为32M,输出脉冲为200K,则每脉冲为160个时钟,即在200K脉冲时速度分辨率为1/160,有1250脉冲/秒的速度跃阶(吓你一跳吧,应用中能接受不?),而MCX314(日本片子)在任何速度时(可达1-4M脉冲)可达到1/1000的速度精度(芯片内有特殊的补偿算法)。嘿嘿,不久以后将有更好的东东出来,春天或即将来临{:lol:} 。 m......a.......r.......k 有没有完整程序,能否发一份给我 392057976@QQ .COM 一般做法 整张了很大见识{:lol:}{:lol:}{:lol:} 台达的PLC都是AVR做的,能发100K的脉冲啊。。。何解?可能人家的如软件做的好 留个爪印{:shy:} elc-liangzai 发表于 2013-8-14 11:04 static/image/common/back.gif
台达的PLC都是AVR做的,能发100K的脉冲啊。。。何解?可能人家的如软件做的好 ...
早些时候拆了一个ES2,用的是STM32的 学习一下。。。。
页:
[1]