11 #define PWMSS_CLK 100e6
13 #define PWMSS_CLK_2 50e6
26 CONSTRUCTOR PwmssUdt(
BYVAL T
AS Pruio_
PTR)
31 i += 1 : .DRam[i] = &h48300000uL
32 i += 1 : .DRam[i] =
IIF(.DevAct
AND PRUIO_ACT_PWM0, &h44E000D4uL, 0)
34 i += 1 : .DRam[i] = &h48302000uL
35 i += 1 : .DRam[i] =
IIF(.DevAct
AND PRUIO_ACT_PWM1, &h44E000CCuL, 0)
37 i += 1 : .DRam[i] = &h48304000uL
38 i += 1 : .DRam[i] =
IIF(.DevAct
AND PRUIO_ACT_PWM2, &h44E000D8uL, 0)
56 var p_mem = .MOffs + .DRam[InitParA] _
57 , p_val =
cast(
any ptr, .DRam) + PRUIO_DAT_PWM
58 FOR i
AS LONG = 0
TO PRUIO_AZ_PWMSS
61 p_val +=
SIZEOF(PwmssArr)
64 Conf(i) = p_mem + .DSize
69 .DeAd = 0 : .ClVa = 0 : p_mem += 16 :
CONTINUE FOR
72 .CLKCONFIG = &b0100010001
83 p_mem +=
SIZEOF(PwmssSet)
102 CONSTRUCTOR PwmMod(
BYVAL T
AS Pruio_
PTR)
120 BYVAL Ball
AS UInt8 _
121 ,
BYVAL Hz
AS Float_t
PTR = 0 _
122 ,
BYVAL Du
AS Float_t
PTR = 0)
AS ZSTRING PTR
125 BallCheck(
" PWM", .Errr)
127 VAR m = .BallInit[Ball]
AND &b111
129 SELECT CASE AS CONST Ball
130 CASE P8_13 : e =
IIF(m = 4,
pwm_get(2, Hz, Du, 1), E1)
131 CASE P8_19 : e =
IIF(m = 4,
pwm_get(2, Hz, Du, 0), E1)
132 CASE P8_34 : e =
IIF(m = 2,
pwm_get(1, Hz, Du, 1), E1)
133 CASE P8_36 : e =
IIF(m = 2,
pwm_get(1, Hz, Du, 0), E1)
134 CASE P8_45 : e =
IIF(m = 3,
pwm_get(2, Hz, Du, 1), E1)
135 CASE P8_46 : e =
IIF(m = 3,
pwm_get(2, Hz, Du, 0), E1)
136 CASE P9_14 : e =
IIF(m = 6,
pwm_get(1, Hz, Du, 0), E1)
137 CASE P9_16 : e =
IIF(m = 6,
pwm_get(1, Hz, Du, 1), E1)
138 CASE P9_21 : e =
IIF(m = 3,
pwm_get(0, Hz, Du, 1), E1)
139 CASE P9_22 : e =
IIF(m = 3,
pwm_get(0, Hz, Du, 0), E1)
140 CASE P9_29 : e =
IIF(m = 1,
pwm_get(0, Hz, Du, 1), E1)
141 CASE P9_31 : e =
IIF(m = 1,
pwm_get(0, Hz, Du, 0), E1)
142 CASE P9_28 : e =
IIF(m = 4,
cap_get(2, Hz, Du), E1)
143 CASE P9_42 : e =
IIF(m = 0,
cap_get(0, Hz, Du), E1)
145 END SELECT :
IF e
THEN .Errr = e :
RETURN .Errr
188 BYVAL Ball
AS UInt8, _
189 BYVAL Hz
AS Float_t, _
190 BYVAL Du
AS Float_t)
AS ZSTRING PTR
193 BallCheck(
" PWM", .Errr)
195 VAR m = .BallInit[Ball]
AND &b111
197 SELECT CASE AS CONST Ball
198 CASE P8_13 :
IF m <> 4
THEN IF .setPin(Ball, &h0C)
THEN RETURN .Errr
200 CASE P8_19 :
IF m <> 4
THEN IF .setPin(Ball, &h0C)
THEN RETURN .Errr
202 CASE P8_34 :
IF m <> 2
THEN IF .setPin(Ball, &h0A)
THEN RETURN .Errr
204 CASE P8_36 :
IF m <> 2
THEN IF .setPin(Ball, &h0A)
THEN RETURN .Errr
206 CASE P8_45 :
IF m <> 3
THEN IF .setPin(Ball, &h0B)
THEN RETURN .Errr
208 CASE P8_46 :
IF m <> 3
THEN IF .setPin(Ball, &h0B)
THEN RETURN .Errr
210 CASE P9_14 :
IF m <> 6
THEN IF .setPin(Ball, &h0E)
THEN RETURN .Errr
212 CASE P9_16 :
IF m <> 6
THEN IF .setPin(Ball, &h0E)
THEN RETURN .Errr
214 CASE P9_21 :
IF m <> 3
THEN IF .setPin(Ball, &h0B)
THEN RETURN .Errr
216 CASE P9_22 :
IF m <> 3
THEN IF .setPin(Ball, &h0B)
THEN RETURN .Errr
218 CASE P9_29 :
IF m <> 1
THEN IF .setPin(Ball, &h09)
THEN RETURN .Errr
220 CASE P9_31 :
IF m <> 1
THEN IF .setPin(Ball, &h09)
THEN RETURN .Errr
222 CASE P9_28 :
IF m <> 4
THEN IF .setPin(Ball, &h0C)
THEN RETURN .Errr
224 CASE P9_42 :
IF m <> 0
THEN IF .setPin(Ball, &h08)
THEN RETURN .Errr
226 END SELECT : .Errr = E0 :
RETURN .Errr
247 ,
BYVAL Freq
AS Float_t
PTR = 0 _
248 ,
BYVAL Duty
AS Float_t
PTR = 0)
AS ZSTRING PTR
250 WITH *Top->PwmSS->Conf(Nr)
252 IF 0 =
BIT(.ECCTL2, 9)
THEN RETURN @
"eCAP module not in output mode"
253 IF Freq
THEN *Freq = PWMSS_CLK / .CAP1
254 IF Duty
THEN *Duty = .CAP2 / .CAP1
278 ,
BYVAL F
AS Float_t _
279 ,
BYVAL D
AS Float_t = 0.)
AS ZSTRING PTR
281 STATIC AS CONST Float_t _
282 f_min = PWMSS_CLK / &hFFFFFFFFuL
284 freq(...) = {0., 0., 0.}
286 cnt(...) = {0, 0, 0} _
287 , cmp(...) = {0, 0, 0}
291 IF 2 <> .PwmSS->Conf(Nr)->ClVa
THEN .Errr = E2 :
RETURN E2
292 IF 0 = cnt(Nr)
ANDALSO _
293 F <= 0.
THEN .Errr = E3 :
RETURN E3
296 IF F < f_min
ORELSE _
297 F > PWMSS_CLK_2
THEN Top->Errr = E4 :
RETURN E4
298 cnt(Nr) =
CUINT(PWMSS_CLK / F)
300 IF D >= 0
THEN cmp(Nr) =
IIF(D > 1., cnt(Nr),
CUINT(cnt(Nr) * D))
302 .Conf(Nr)->CAP1 = cnt(Nr)
303 .Conf(Nr)->CAP2 = cmp(Nr)
304 IF .Conf(Nr)->ECCTL2 <> .PwmMode
THEN
305 .Conf(Nr)->ECCTL2 = .PwmMode
311 IF .DRam[0] > PRUIO_MSG_IO_OK
THEN RETURN 0
313 WHILE .DRam[1] :
WEND
316 .DRam[2] = .PwmSS->Conf(Nr)->DeAd + &h100
317 .DRam[1] = r
OR (PRUIO_COM_PWM_CAP
SHL 24)
339 ,
BYVAL F
AS Float_t
PTR = 0 _
340 ,
BYVAL Du
AS Float_t
PTR = 0 _
341 ,
BYVAL Mo
AS UInt8)
AS ZSTRING PTR
343 WITH *Top->PwmSS->Conf(Nr)
345 VAR p =
CAST(UInt32, .TBPRD)
347 VAR d1 = (.TBCTL
SHR 7)
AND &b111, d2 = (.TBCTL
SHR 10)
AND &b111
348 VAR cg = p *
IIF(d1, d1
SHL 1, 1) * (1
SHL d2)
349 *F = PWMSS_CLK /
IIF(
BIT(.TBCTL, 1), cg
SHL 1, cg + 1)
352 VAR c =
CAST(UInt32,
IIF(Mo, .CMPB, .CMPA))
353 IF BIT(.TBCTL, 1)
THEN
355 IF IIF(Mo, .AQCTLB, .AQCTLA)
AND &b010001000000
THEN c = p - c
387 ,
BYVAL F
AS Float_t _
388 ,
BYVAL Da
AS Float_t = 0. _
389 ,
BYVAL Db
AS Float_t = 0.)
AS ZSTRING PTR
391 STATIC AS CONST Float_t _
392 f_min = PWMSS_CLK_2 / &h6FFF900
393 STATIC AS UInt16 pars(..., 1) = { _
402 , { 16, 2 + 2
SHL 3} _
403 , { 20, 5 + 1
SHL 3} _
404 , { 24, 6 + 1
SHL 3} _
405 , { 28, 7 + 1
SHL 3} _
406 , { 32, 2 + 3
SHL 3} _
407 , { 40, 5 + 2
SHL 3} _
408 , { 48, 3 + 3
SHL 3} _
409 , { 56, 7 + 2
SHL 3} _
410 , { 64, 4 + 3
SHL 3} _
411 , { 80, 5 + 3
SHL 3} _
412 , { 96, 6 + 3
SHL 3} _
413 , { 112, 7 + 3
SHL 3} _
414 , { 128, 0 + 7
SHL 3} _
415 , { 160, 5 + 4
SHL 3} _
416 , { 192, 6 + 4
SHL 3} _
417 , { 224, 7 + 4
SHL 3} _
418 , { 256, 1 + 7
SHL 3} _
419 , { 320, 5 + 5
SHL 3} _
420 , { 384, 3 + 6
SHL 3} _
421 , { 448, 7 + 5
SHL 3} _
422 , { 512, 2 + 7
SHL 3} _
423 , { 640, 5 + 6
SHL 3} _
424 , { 768, 3 + 7
SHL 3} _
425 , { 896, 7 + 6
SHL 3} _
426 , {1024, 4 + 7
SHL 3} _
427 , {1280, 5 + 7
SHL 3} _
428 , {1536, 6 + 7
SHL 3} _
429 , {1792, 7 + 7
SHL 3} _
433 freq(...) = {0., 0., 0.} _
434 , d_a(...) = {0., 0., 0.} _
435 , d_b(...) = {0., 0., 0.}
437 cnt(...) = {0, 0, 0} _
438 , c_a(...) = {0, 0, 0} _
439 , c_b(...) = {0, 0, 0}
442 WITH *Top->PwmSS->Conf(Nr)
443 IF 2 <> .ClVa
THEN Top->Errr = E2 :
RETURN E2
445 IF F <= 0.
THEN Top->Errr = E3 :
RETURN E3
447 IF F > 0.
ANDALSO freq(Nr) <> F
THEN cnt(Nr) = 0
451 VAR cycle =
IIF(F > f_min
ANDALSO F <= PWMSS_CLK_2,
CUINT(.5 + PWMSS_CLK / F), 0uL)
452 IF 2 > cycle
THEN Top->Errr = E4 :
RETURN E4
455 IF cycle <= &h10000
THEN
457 ELSEIF cycle < &h20000
THEN
458 cnt(Nr) = cycle
SHR 1
461 VAR x =
UBOUND(pars)
SHR 2 _
462 , fac = cycle
SHR 17 _
466 i +=
IIF(fac >= pars(i, 0), x, -x)
469 WHILE fac >= pars(i, 0)
473 cnt(Nr) =
CUINT(.5 + PWMSS_CLK_2 / pars(i, 0) / F)
487 IF Da >= 0.
THEN d_a(Nr) =
IIF(Da > 1., 1., Da) : c_a(Nr) = 0
489 IF BIT(.TBCTL, 1)
THEN
491 THEN .AQCTLA = &b000001000010 : c_a(Nr) =
CUINT((cnt(Nr)
SHL 1) * (1 - d_a(Nr))) _
492 ELSE .AQCTLA = &b000000010010 : c_a(Nr) =
CUINT((cnt(Nr)
SHL 1) * d_a(Nr))
494 .AQCTLA = &b000000010010 : c_a(Nr) =
CUINT(.5 + (cnt(Nr) + 1) * d_a(Nr))
499 IF Db >= 0.
THEN d_b(Nr) =
IIF(Db > 1., 1., Db) : c_b(Nr) = 0
501 IF BIT(.TBCTL, 1)
THEN
503 THEN .AQCTLB = &b010000000010 : c_b(Nr) =
CUINT((cnt(Nr)
SHL 1) * (1 - d_b(Nr))) _
504 ELSE .AQCTLB = &b000100000010 : c_b(Nr) =
CUINT((cnt(Nr)
SHL 1) * d_b(Nr))
506 .AQCTLB = &b000100000010 : c_b(Nr) =
CUINT(.5 + (cnt(Nr) + 1) * d_b(Nr))
510 aqc = .AQCTLA + .AQCTLB
SHL 16
514 IF .DRam[0] > PRUIO_MSG_IO_OK
THEN RETURN 0
516 WHILE .DRam[1] :
WEND
517 .DRam[5] = cnt(Nr)
SHL 16
519 .DRam[3] = c_a(Nr) + c_b(Nr)
SHL 16
520 .DRam[2] = .PwmSS->Conf(Nr)->DeAd + &h200
521 .DRam[1] =
IIF(ctl, ctl, 0) + PRUIO_COM_PWM
SHL 24
540 CONSTRUCTOR CapMod(
BYVAL T
AS Pruio_
PTR)
570 BYVAL Ball
AS UInt8 _
571 ,
BYVAL FLow
AS Float_t = 0.)
AS ZSTRING PTR
575 BallCheck(
" CAP", .Errr)
577 m = .BallInit[Ball]
AND &b111
579 SELECT CASE AS CONST Ball
580 CASE P9_28 :
IF m <> 4
THEN IF .setPin(Ball, &h24)
THEN RETURN .Errr
582 CASE P9_42 :
IF m <> 0
THEN IF .setPin(Ball, &h20)
THEN RETURN .Errr
593 CASE ELSE : .Errr = E0 :
RETURN .Errr
597 IF 2 <> .Conf(m)->ClVa
THEN Top->Errr = E2 :
RETURN E2
598 VAR cnt = &hFFFFFFFFul
599 IF FLow > PWMSS_CLK/ &hFFFFFFFFul
THEN
600 cnt =
CUINT(PWMSS_CLK / FLow)
601 IF cnt < 200
THEN cnt = 200
605 IF .Conf(m)->ECCTL2 <> .CapMode
THEN
606 .Conf(m)->ECCTL2 = .CapMode
607 IF Top->DRam[0] > PRUIO_MSG_IO_OK
THEN RETURN 0
609 WHILE Top->DRam[1] :
WEND
610 Top->DRam[2] = .Conf(m)->DeAd + &h100
611 Top->DRam[1] = .CapMode + (PRUIO_COM_CAP
SHL 24)
641 BYVAL Ball
AS UInt8 _
642 ,
BYVAL Hz
AS Float_t
PTR = 0 _
643 ,
BYVAL Du
AS Float_t
PTR = 0)
AS ZSTRING PTR
647 BallCheck(
" CAP", .Errr)
649 m = .BallInit[Ball]
AND &b111
651 SELECT CASE AS CONST Ball
652 CASE P9_28 :
IF m <> 4
THEN e = E1
ELSE m = 2
653 CASE P9_42 :
IF m <> 0
THEN e = E1
660 END SELECT :
IF e
THEN .Errr = e :
RETURN .Errr
662 IF .DRam[0] > PRUIO_MSG_IO_OK
THEN
665 .Errr = @
"IO/RB mode not running" :
RETURN .Errr
668 WITH *Top->PwmSS->Raw(m)
670 IF Hz
THEN *Hz =
IIF(.C2, PWMSS_CLK / .C2, 0.)
671 IF Du
THEN *Du =
IIF(.C2, (.C2 - .C1) / .C2, 0.)