Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <math.h>
  4.  
  5. #ifdef AVR
  6. #include <avr/pgmspace.h>
  7. #define printf_PP(s, ...) printf_P(PSTR(s), ## __VA_ARGS__)
  8. #else
  9. #define printf_PP(s, ...) printf(s, ## __VA_ARGS__)
  10. #endif
  11.  
  12. uint32_t AD8950_setting_integer(uint32_t f_osc,
  13. uint32_t f_tune_hz, uint32_t f_tune_millihz) {
  14. uint64_t tmp = (((uint64_t)f_tune_hz) << 32) + (f_osc+1)/2;
  15. tmp += ((((uint64_t)f_tune_millihz) << 32) + 500)/ 1000;
  16. return tmp / f_osc;
  17. }
  18.  
  19. uint32_t AD8950_setting_fp(uint32_t f_osc,
  20. uint32_t f_tune_hz, uint32_t f_tune_millihz) {
  21. return (uint32_t)round((f_tune_hz + 1e-3 * f_tune_millihz)
  22. * 4294967296. / f_osc);
  23. }
  24.  
  25.  
  26. uint32_t AD8950_setting_integer(uint32_t f_osc, uint32_t f_tune) {
  27. uint64_t tmp = (((uint64_t)f_tune) << 32) + (f_osc+1)/2;
  28. return tmp / f_osc;
  29. }
  30.  
  31. uint32_t AD8950_setting_fp(uint32_t f_osc, uint32_t f_tune) {
  32. return (uint32_t)round(f_tune * 4294967296. / f_osc);
  33. }
  34.  
  35. uint32_t absdiff(uint32_t a, uint32_t b)
  36. {
  37. if(a<b) return b-a;
  38. return a-b;
  39. }
  40.  
  41. int main() {
  42. uint32_t osc_nom = 125000000.;
  43.  
  44. printf_PP("60kHz for varying oscillator offsets:\n");
  45. printf_PP("osc_off setting_int setting_fp\n");
  46. for(int32_t osc_off = -250; osc_off <= 250; osc_off += 50) {
  47. printf_PP("% 6d %10lu %10lu\n", (int)osc_off,
  48. (unsigned long)AD8950_setting_integer(osc_nom + osc_off, 60000),
  49. (unsigned long)AD8950_setting_fp(osc_nom + osc_off, 60000));
  50. }
  51. printf_PP("\n");
  52.  
  53. printf_PP("60.000123kHz (60000.123Hz) for varying oscillator offsets:\n");
  54. printf_PP("osc_off setting_int setting_fp\n");
  55. for(int32_t osc_off = -250; osc_off <= 250; osc_off += 50) {
  56. printf_PP("% 6d %10lu %10lu\n", (int)osc_off,
  57. (unsigned long)AD8950_setting_integer(osc_nom + osc_off, 60000, 123),
  58. (unsigned long)AD8950_setting_fp(osc_nom + osc_off, 60000, 123));
  59. }
  60. printf_PP("\n");
  61.  
  62. printf_PP("1MHz for varying oscillator offsets:\n");
  63. printf_PP("osc_off setting_int setting_fp\n");
  64. for(int32_t osc_off = -250; osc_off <= 250; osc_off += 50) {
  65. printf_PP("% 6d %10lu %10lu\n", (int)osc_off,
  66. (unsigned long)AD8950_setting_integer(osc_nom + osc_off, 1000000),
  67. (unsigned long)AD8950_setting_fp(osc_nom + osc_off, 1000000));
  68. }
  69.  
  70. printf_PP("\nSearching for worst error ...\n");
  71. printf_PP("osc_off freq setting_int setting_fp setting_err\n");
  72. int32_t worst_off, worst_f, worst_err=0, n_err=0, n_tri=0;
  73. for(int32_t osc_off = -250; osc_off <= 250; osc_off += 3) {
  74. uint32_t osc = osc_nom + osc_off;
  75. for(uint32_t freq = 10000, freq_m=0; freq < osc/4; freq+=9, freq_m = (freq_m + 337) % 1000)
  76. {
  77. uint32_t setting_integer = AD8950_setting_integer(osc, freq, freq_m);
  78. uint32_t setting_fp = AD8950_setting_fp(osc, freq, freq_m);
  79. uint32_t err = absdiff(setting_integer, setting_fp);
  80.  
  81. if(err > worst_err)
  82. {
  83. worst_off = osc_off;
  84. worst_f = freq;
  85. worst_err = err;
  86. n_err = 0;
  87. }
  88. if(worst_err && err == worst_err)
  89. {
  90. n_err ++;
  91. if(n_err < 10)
  92. printf_PP("% 6d %10lu.%03d %10lu %10lu %d\n",
  93. (int)osc_off, (unsigned long)freq, (int) freq_m,
  94. (unsigned long)setting_integer,
  95. (unsigned long)setting_fp,
  96. err);
  97. else if(n_err == 10)
  98. printf_PP("...\n");
  99. }
  100. n_tri ++;
  101. }
  102. }
  103. printf_PP("worst error of %d counts", worst_err);
  104. printf_PP(" seen in %d of %d test cases\n", n_err, n_tri);
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement