Hej Lars,

On 01/03/14 23:09, Lars Walenius wrote:
Hi Magnus

You are correct in a way. The code  is more complicated than it should have 
been.

Well, there is potential for improvements.

The first row with comment “corr for time” is the I-term.

OK.

The second row that integrates the frequency offset is the P-term and could 
have been just proportional to the time offset I understand now (I have thought 
of it before but totally forgot it).

Well, as it says now it is

dacValue = dacValue + I_contribution
dacValue = dacValue + P_contribution

rather than

I = I + I_contribution
dacValue = I + P_contribution

The dacValue you create will integrate both the I and P contributions.
However, that's not what your code is doing.

The "P-contribution" is really a frequency input rather than proportional time/phase input. That is correct to integrate to get P-ish. A more direct way would be to remove the differentiating of the input and remove the integration on the output. That would make the code clearer about what's going on.

As I choosed to work with integers I have to scale the values to avoid 
truncation errors (that I still get with large time constants ☹. Probably it 
would be better to use floating point calculations.

You need to use long enough integers for it to work. Integer scaling is a bitch, but if you do it right, it can work very well for you.

Personally, I'm lazy and just throw a ton of bits onto it, turns out it is cheap and I can worry about other parts of the design, and there is plenty of those to go around anyway.

Cheers,
Magnus
_______________________________________________
time-nuts mailing list -- time-nuts@febo.com
To unsubscribe, go to https://www.febo.com/cgi-bin/mailman/listinfo/time-nuts
and follow the instructions there.

Reply via email to