junmadianzi 发表于 2009-12-1 10:59:02

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;
      };
}

zya2008 发表于 2009-12-1 11:25:42

用CPLD+AVR即可产生100K的脉冲串!

junmadianzi 发表于 2009-12-1 11:27:56

能限定脉冲的数量么

coody 发表于 2009-12-1 11:33:46

我用普通的MCU按照DDS原理就可以产生1HZ~100KHZ的脉冲,步进1HZ,不过在输出50KHZ以上时,有一点点抖动,这是DDS原理造成的

song1km 发表于 2009-12-1 11:36:44

m....ar....k

Stitch 发表于 2009-12-1 11:43:09

记号下……………

shanyan 发表于 2009-12-1 13:04:34

记号下

junmadianzi 发表于 2009-12-1 20:10:41

coody,你好!能否简要说下DDS,百度一下,感觉不得要领

WAN1 发表于 2009-12-1 23:48:22

DDS原理简介(中文):http://www.docin.com/p-503926.html
实用信号源的设计和制作(实验指导)直接数字合成(DDS).pdfourdev_509761.pdf(文件大小:212K) (原文件名:实用信号源的设计和制作(实验指导)直接数字合成(DDS).pdf)

junmadianzi 发表于 2009-12-4 13:54:08

PLC的高速脉冲一般用来控制伺服系统或步进系统,脉冲频率正比于转速,脉冲数量正比于转角.DDS完成的信号源能完成以上控制么.

junmadianzi 发表于 2009-12-8 11:32:53

是不是弄到真东西的时候,交流就有些问题

heky 发表于 2009-12-8 11:59:04

脉冲频率无所谓的,100hz加速到1000hz,你以为就是100-101-102.。。。-999-1000hz吗?还dds呢,首先,驱动器接收脉冲,101和100就没区别。只要分段加速,驱动器就没问题,现在的驱动器都很厉害。我的应用,分成20段加减速。在伺服和步进驱动器都测试过,上述提出dds加速的,你们做信号行。但是PLC这个东西,能省时间最好。三菱fx2n也是分段加速的,可以看手册提示。老的脉冲输出方案用cpld是没办法。现在新的CPU,大可以用内部定时器来做脉冲输出(我实践过200K高速脉冲输出,2轴,并且不影响PLC执行周期)。

当然做运动控制时候,做多轴插补,cpld是不可少的。

heky 发表于 2009-12-8 12:06:21

1.对于lz位的问题1,2.我觉得是讨论厨师给猪做饭的问题。现在不讲究做的好还是差,关键是对象不需要这么高精度的脉冲源。你的频率100-150hz,对驱动器来说无所谓。
2.avr做这种控制,心有余而力不足。早点换芯片吧,stm32(理由1:位控制,2.timer强,但是要注意用法3.ab相输入,ab相脉冲输出都可以实现)。

junmadianzi 发表于 2009-12-8 12:43:17

我的工作是plc做些设备控制的,PLC的脉冲输出频率是10~10000Hz任意可调的.当我用AVR来实现这一功能时,就觉得存以上的问题.

我用的PLC主控MCU为H8@25M,并没有CPLD/FPGA,这样能实现6路10KHz高速计数,2路10KHz高速脉冲输出,并且可以开两个通讯口,最高通讯波特率达115.2K,以上10样任务均隔100us产生一中断(并不一定是中断),假定这种中断是以相同的间隔产生,则MCU每隔10us就要被中断一次,他还能干些其他的活吗?

heky 发表于 2009-12-8 13:18:03

建议还是换硬件。照你的这个,就算实现也是问题。

heky 发表于 2009-12-8 13:21:20

以前我们用H8-2357,两路高速计数单相(2 timer) 两路高速输出(4 timer(2路做pwm输出,2路做脉冲计数/调速/截止))。

你上面的规格是不是太多了。要是必须得这样还是建议加CPLD吧。

junmadianzi 发表于 2009-12-8 18:12:52

看来台达PLC的研发人员还是相当厉害

whirlyx 发表于 2010-9-14 16:11:48

实际上PLC输出频率的分辨率真能够达到1HZ吗?十分怀疑中。楼主有条件可以检测检测。我估计是不能的。

tsb0574 发表于 2010-9-14 17:17:24

回复【17楼】whirlyx
实际上plc输出频率的分辨率真能够达到1hz吗?十分怀疑中。楼主有条件可以检测检测。我估计是不能的。
-----------------------------------------------------------------------

说的对,PLC的时钟频率一般在50M左右,输出频率越高分辨率越低!!

gpfrank 发表于 2010-9-14 21:32:41

回复【16楼】junmadianzi
-----------------------------------------------------------------------

为什么说台达厉害?那位是台达的?

lingligang 发表于 2011-12-6 17:45:21

三菱FX1S的脉冲指令我做过测试,步进1hz,最高是200KHZ

hw020411317 发表于 2012-4-11 16:54:50

西门子的224XP与226好像也是200K

vlog_user 发表于 2012-4-11 21:56:48

本帖最后由 vlog_user 于 2012-4-12 11:37 编辑

原内容删除,低调

vlog_user 发表于 2012-4-12 11:56:29

本帖最后由 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:} 。

15706753 发表于 2012-4-15 13:14:29

m......a.......r.......k

HMH 发表于 2013-1-24 13:58:39

有没有完整程序,能否发一份给我 392057976@QQ .COM

mdj-fish 发表于 2013-1-25 14:01:03

一般做法

ssht428 发表于 2013-4-23 10:33:55

整张了很大见识{:lol:}{:lol:}{:lol:}

elc-liangzai 发表于 2013-8-14 11:04:17

台达的PLC都是AVR做的,能发100K的脉冲啊。。。何解?可能人家的如软件做的好

biqi 发表于 2013-8-14 15:12:54

留个爪印{:shy:}

tuowai 发表于 2013-8-24 16:19:57

elc-liangzai 发表于 2013-8-14 11:04 static/image/common/back.gif
台达的PLC都是AVR做的,能发100K的脉冲啊。。。何解?可能人家的如软件做的好 ...

早些时候拆了一个ES2,用的是STM32的

siko 发表于 2013-9-12 16:48:43

学习一下。。。。
页: [1]
查看完整版本: PLC的高速脉冲是怎样练成的