在测频率时,发现两个问题,一个是定时不准,没法得到准确采样时长;另一个是高速计数读数不准。才玩PLC不久,请大家帮忙分析指点。
1、定时不准,误差得有超17%左右。比如,用200ms的定时中断0,5次得到1s,中断中间搞个脚输出,用频率计测量周期就可以知道差多少,差不多1s实测是1171。将200改成171才能是5次1s左右。那所有SMART实物的一致性和随温度的变化还要去研究,这个思路放弃。用T32是一个效果。
我的方法是用标准频率1kHz接入PLC高速计数器HSC0,计1000次中断,中断里再次读HC0的值,发现是1013左右(有正负1误差跳变),多出来的13ms,理解成有13ms的中断响应时间。中断里搞管脚输出,测量周期,确实是1013ms。没关系,虽然多出来了13ms,但它是准确的,后面就好办。同时也测了一下PLC内部计时差,两次中断间是865ms。计算一下,用内部的计满1000ms,对应的实际时间是1171,也差不多是超17%。跟上面的误差值也对得上。
2、高速计数不准,主要是多个之间同时计数有差别。我HSC0用于采样标准1kHz,无论是PLC自产生标准频率,还是外部信号发生器产生标准频率,基本上中断中得数都是1013左右。我认为这个是准确的。现在的问题是,我在中断里还要读取另外的高速计数器的值,HSC3是971,HSC4是985。三个高数计数器同时复位并读数,产生了3个不同的值,最大得有4%了。这个差异是怎么产生的?.没法再提高精度了吗?IO口的滤波已设置为0.2ms。
3、另一个问题,最终我是要用PLC自产生1kHz频率的,经测量,还很准。我看了一下相关资料,比如下面的,其中一个同时执行HSC/PLS,是不能同时用HSC和PLS吗?我试了下,好像没问题。
ENO = 0 时的错误条件
HSC:
0001H 在 HDEF 之前执行 HSC
0005H 同时执行 HSC/PLS
0090H HSC 编号无效
主程序
段1:
LD First_Scan_On
CALL HSC0_INIT
CALL HSC3_INT
CALL HSC4_INT
BITIM last_time
ENI
段2:(目的是方便看PLC运行状态时的下面几个变量)
LD Clock_1s
DISI
MOVD FREQ, FREQ
MOVD FREQ1, FREQ1
MOVD FREQ2, FREQ2
MOVD Interval_time, interval_time1
ENI
HSC0初始化:
LD Always_On
MOVB 2#11111100, HSC0_Ctrl //??????????£o ?ó??êy£? ò???ó?£?
MOVD +0, HSC0_CV //×°?? CV
MOVD 1000, HSC0_PV //×°?? PV
HDEF 0, 0
ATCH INT_12, 12
HSC 0
HSC3初始化:
LD Always_On
MOVB 2#11111100, HSC3_Ctrl //??????????£o ?ó??êy£? ò???ó?£?
MOVD +0, HSC3_CV //×°?? CV
MOVD 10000, HSC3_PV //×°?? PV
HDEF 3, 0
HSC 3
HSC4初始化:
LD Always_On
MOVB 2#11111100, HSC4_Ctrl //??????????£o ?ó??êy£? ò???ó?£?
MOVD +0, HSC4_CV //×°?? CV
MOVD 10000, HSC4_PV //×°?? PV
HDEF 4, 0
HSC 4
INT12中断:
LD Always_On
CITIM last_time, Interval_time
BITIM last_time
MOVD HC0, FREQ
MOVD HC3, FREQ1
MOVD HC4, FREQ2
MOVB 2#11001100, HSC0_Ctrl
MOVB 2#11001100, HSC3_Ctrl
MOVB 2#11001100, HSC4_Ctrl
MOVD +0, HSC0_CV
MOVD +0, HSC3_CV
MOVD +0, HSC4_CV
HSC 0
HSC 3
HSC 4
CRETI