Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdint.h>
- #include <math.h>
- #ifdef AVR
- #include <avr/pgmspace.h>
- #define printf_PP(s, ...) printf_P(PSTR(s), ## __VA_ARGS__)
- #else
- #define printf_PP(s, ...) printf(s, ## __VA_ARGS__)
- #endif
- uint32_t AD8950_setting_integer(uint32_t f_osc,
- uint32_t f_tune_hz, uint32_t f_tune_millihz) {
- uint64_t tmp = (((uint64_t)f_tune_hz) << 32) + (f_osc+1)/2;
- tmp += ((((uint64_t)f_tune_millihz) << 32) + 500)/ 1000;
- return tmp / f_osc;
- }
- uint32_t AD8950_setting_fp(uint32_t f_osc,
- uint32_t f_tune_hz, uint32_t f_tune_millihz) {
- return (uint32_t)round((f_tune_hz + 1e-3 * f_tune_millihz)
- * 4294967296. / f_osc);
- }
- uint32_t AD8950_setting_integer(uint32_t f_osc, uint32_t f_tune) {
- uint64_t tmp = (((uint64_t)f_tune) << 32) + (f_osc+1)/2;
- return tmp / f_osc;
- }
- uint32_t AD8950_setting_fp(uint32_t f_osc, uint32_t f_tune) {
- return (uint32_t)round(f_tune * 4294967296. / f_osc);
- }
- uint32_t absdiff(uint32_t a, uint32_t b)
- {
- if(a<b) return b-a;
- return a-b;
- }
- int main() {
- uint32_t osc_nom = 125000000.;
- printf_PP("60kHz for varying oscillator offsets:\n");
- printf_PP("osc_off setting_int setting_fp\n");
- for(int32_t osc_off = -250; osc_off <= 250; osc_off += 50) {
- printf_PP("% 6d %10lu %10lu\n", (int)osc_off,
- (unsigned long)AD8950_setting_integer(osc_nom + osc_off, 60000),
- (unsigned long)AD8950_setting_fp(osc_nom + osc_off, 60000));
- }
- printf_PP("\n");
- printf_PP("60.000123kHz (60000.123Hz) for varying oscillator offsets:\n");
- printf_PP("osc_off setting_int setting_fp\n");
- for(int32_t osc_off = -250; osc_off <= 250; osc_off += 50) {
- printf_PP("% 6d %10lu %10lu\n", (int)osc_off,
- (unsigned long)AD8950_setting_integer(osc_nom + osc_off, 60000, 123),
- (unsigned long)AD8950_setting_fp(osc_nom + osc_off, 60000, 123));
- }
- printf_PP("\n");
- printf_PP("1MHz for varying oscillator offsets:\n");
- printf_PP("osc_off setting_int setting_fp\n");
- for(int32_t osc_off = -250; osc_off <= 250; osc_off += 50) {
- printf_PP("% 6d %10lu %10lu\n", (int)osc_off,
- (unsigned long)AD8950_setting_integer(osc_nom + osc_off, 1000000),
- (unsigned long)AD8950_setting_fp(osc_nom + osc_off, 1000000));
- }
- printf_PP("\nSearching for worst error ...\n");
- printf_PP("osc_off freq setting_int setting_fp setting_err\n");
- int32_t worst_off, worst_f, worst_err=0, n_err=0, n_tri=0;
- for(int32_t osc_off = -250; osc_off <= 250; osc_off += 3) {
- uint32_t osc = osc_nom + osc_off;
- for(uint32_t freq = 10000, freq_m=0; freq < osc/4; freq+=9, freq_m = (freq_m + 337) % 1000)
- {
- uint32_t setting_integer = AD8950_setting_integer(osc, freq, freq_m);
- uint32_t setting_fp = AD8950_setting_fp(osc, freq, freq_m);
- uint32_t err = absdiff(setting_integer, setting_fp);
- if(err > worst_err)
- {
- worst_off = osc_off;
- worst_f = freq;
- worst_err = err;
- n_err = 0;
- }
- if(worst_err && err == worst_err)
- {
- n_err ++;
- if(n_err < 10)
- printf_PP("% 6d %10lu.%03d %10lu %10lu %d\n",
- (int)osc_off, (unsigned long)freq, (int) freq_m,
- (unsigned long)setting_integer,
- (unsigned long)setting_fp,
- err);
- else if(n_err == 10)
- printf_PP("...\n");
- }
- n_tri ++;
- }
- }
- printf_PP("worst error of %d counts", worst_err);
- printf_PP(" seen in %d of %d test cases\n", n_err, n_tri);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement