diff --git a/quad/vivado_workspace/PWM_Combined_Tests/PWM_Combined_Tests.sdk/Loopback_Error_Check/src/helloworld.c b/quad/vivado_workspace/PWM_Combined_Tests/PWM_Combined_Tests.sdk/Loopback_Error_Check/src/helloworld.c index 2d20f1a9153f65c0948727e76b44d59eb2dc7dd1..ea39a04e3cd0304f6077ff45cc66cd99b69cb5f2 100644 --- a/quad/vivado_workspace/PWM_Combined_Tests/PWM_Combined_Tests.sdk/Loopback_Error_Check/src/helloworld.c +++ b/quad/vivado_workspace/PWM_Combined_Tests/PWM_Combined_Tests.sdk/Loopback_Error_Check/src/helloworld.c @@ -51,6 +51,7 @@ #include "xparameters.h" #include "xuartps.h" #include "sleep.h" +#include "math.h" int main() { init_platform(); @@ -61,33 +62,43 @@ int main() { (volatile uint32_t*) (XPAR_PWM_RECORDER_0_S_AXI_BASEADDR); volatile uint32_t* pwmGenerate = (volatile uint32_t*) (XPAR_PWM_SIGNAL_OUT_0_S_AXI_BASEADDR); + while (1) { + print( + "Please connect JB0 and JB1 with an external jumper.\r\nWhen ready, press any button.\n\r"); + while (buttonsGPIO[0] == 0) + ; + print("Thank You :)\r\n"); - print( - "Please connect JB0 and JB1 with an external jumper.\r\nWhen ready, press any button.\n\r"); - while (buttonsGPIO[0] == 0) - ; - print("Thank You :)\r\n"); + const int min_period = 1000; + const int max_period = 5 * 1000 * 1000; + const float period_step_factor = 1.5; + int period; + for (period = min_period; period < max_period; period *= + period_step_factor) { - pwmGenerate[0] = 50 * 1000; - pwmGenerate[1] = 25 * 1000; + pwmGenerate[1] = period / 2; + pwmGenerate[0] = period; - int iteration; - const int num_iterations = 100; - for (iteration = 0; iteration < num_iterations; iteration++) { - pwmGenerate[1] = (iteration * pwmGenerate[0]) / num_iterations; - usleep(10000); + int duty_iteration; + const int num_duty_iterations = 100; + for (duty_iteration = 0; duty_iteration < num_duty_iterations; + duty_iteration++) { + pwmGenerate[1] = ((duty_iteration + 1) * pwmGenerate[0]) + / (num_duty_iterations + 1); - int error = pwmRecord[0] - pwmGenerate[1]; - int abserror = error; - if (abserror < 0) { - abserror = -error; + usleep(period / 25); + + int error = pwmRecord[0] - pwmGenerate[1]; + int abserror = (error < 0) ? -error : error; + if (abserror > pwmGenerate[0] / 1000) { + xil_printf("%5d Hz, %3d%% Duty Cycle: %d cycle error\r\n", + (50 * 1000 * 1000 / pwmGenerate[0]), + (100 * pwmGenerate[1]) / pwmGenerate[0], error); + } + + } + usleep(period / 5); } - xil_printf("%3d%% Duty Cycle: %c%3d.%08d%% error\r\n", - (100 * pwmGenerate[1]) / pwmGenerate[0], - (error < 0) ? '-' : ' ', - (100 * abserror) / ((int) pwmGenerate[0]), - ((10000000000 * abserror) / ((int) pwmGenerate[0])) - % 100000000); } cleanup_platform(); return 0;