I'm trying to make a stepper motor controller. Every 500 ms it reads ADC input and adjust PWM frequencies (duty cycle is always 50%) of 2 slices -- one for LED and the second for stepper motor driver.
The code works only if I comment one of the slices. Either every line including "LED_PIN" | "slice_numLED" or every line including "STEP_PIN" | "slice_numSTEP". Together neither of the outputs generates pulse signal. What am I doing wrong?
The code works only if I comment one of the slices. Either every line including "LED_PIN" | "slice_numLED" or every line including "STEP_PIN" | "slice_numSTEP". Together neither of the outputs generates pulse signal. What am I doing wrong?
Code:
#include <stdio.h>#include <stdlib.h>#include "pico/stdlib.h"#include "hardware/gpio.h"#include "hardware/adc.h"#include "hardware/pwm.h"#include <math.h>const uint LED_PIN = PICO_DEFAULT_LED_PIN;const uint STEP_PIN = 9;uint slice_numLED = 0;uint slice_numSTEP = 0;uint16_t prev_result = 0;bool repeating_timer_callback(struct repeating_timer *t) {uint16_t result = adc_read();printf("ADC result: %d \n", result);if ( (float)abs(prev_result - result)/result > 0.05 ){//LEDpwm_set_enabled(slice_numLED, false);pwm_set_wrap(slice_numLED, result*16);pwm_set_chan_level(slice_numLED, PWM_CHAN_B, result*8);pwm_set_enabled(slice_numLED, true);//STEPpwm_set_enabled(slice_numSTEP, false);pwm_set_wrap(slice_numSTEP, result*8);pwm_set_chan_level(slice_numSTEP, PWM_CHAN_B, result*4);pwm_set_enabled(slice_numSTEP, true);//SAVEprev_result = result;printf("\tUpdated prev_result \n");} return true;}int main() {stdio_init_all();adc_init(); // Make sure GPIO is high-impedance, no pullups etc adc_gpio_init(26); // Select ADC input 0 (GPIO26) adc_select_input(0);gpio_set_function(LED_PIN, GPIO_FUNC_PWM);gpio_set_function(STEP_PIN, GPIO_FUNC_PWM); slice_numLED = pwm_gpio_to_slice_num(LED_PIN);pwm_set_clkdiv(slice_numLED, 256); // divide by 256slice_numSTEP = pwm_gpio_to_slice_num(STEP_PIN);pwm_set_clkdiv(slice_numSTEP, 64); // divide by 64 struct repeating_timer timer; add_repeating_timer_ms(500, repeating_timer_callback, NULL, &timer); while (true) {sleep_ms(3000);}return 0;}
Statistics: Posted by JustFunnyUsername — Sun Jun 02, 2024 2:57 am