从Freertos任务(ESP32)调用函数的问题



目前我在一个运行自由软件程序的程序中遇到了问题。该程序的目的是控制步进电机以及led。在没有微步进的情况下实现电机控制没有任何问题,因为这两个任务不需要参数,也不调用函数。

然而,当我引入需要两个嵌套函数来调用move_routine任务的微步进时,程序将不做任何事情(没有led闪烁,没有电机转动)。有人对此有任何解决方案吗?或者有任何理由说明为什么这行不通吗?在我看来,从freertos任务中调用函数应该是没问题的。


#include <Arduino.h>
#include <Stepper.h>
/*================PIN DEFINITIONS================*/
#define LEDC_CHANNEL_0  0
#define LEDC_CHANNEL_1  1
#define LEDC_CHANNEL_2  2
#define LEDC_CHANNEL_3  3
const int A1A =  14;
const int A1B = 27;
const int B1A = 26;
const int B2A = 25;
const int ledPin = 33;
/*================VARIABLE DEFINITIONS================*/
int stepnumber = 0;
int Pa; int Pb;
const int stepsPerRev = 200;
Stepper myStepper(stepsPerRev, 14,27,26,25);

/*================Function Definitions================*/

//Analogwrite using LEDC capabilities
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) {
//calculation of duty cycle
uint32_t duty = (4095/valueMax)*min(value, valueMax); 
ledcWrite(channel,duty);
}


void move(int stepnumber, int MAXpower, int wait) {
Pa = (sin(stepnumber*0.098174)*MAXpower);
Pb = (cos(stepnumber*0.098174)*MAXpower);
if (Pa>0)
{ 
ledcAnalogWrite(LEDC_CHANNEL_0,Pa);
ledcAnalogWrite(LEDC_CHANNEL_1,0);
}
else
{
ledcAnalogWrite(LEDC_CHANNEL_0,0);
ledcAnalogWrite(LEDC_CHANNEL_1,abs(Pa));
}

if (Pb>0)
{
ledcAnalogWrite(LEDC_CHANNEL_2,Pb);
ledcAnalogWrite(LEDC_CHANNEL_3,0);
}
else
{
ledcAnalogWrite(LEDC_CHANNEL_2,0);
ledcAnalogWrite(LEDC_CHANNEL_3,abs(Pb));
}
}


void move_routine(void *parameters) {
while(1) {
for (int i=0; i<3199; i++)
{
stepnumber++;
move(stepnumber,255,250);
}
vTaskDelay(3000/portTICK_PERIOD_MS);
for (int i=0; i<1599; i++)
{ 
stepnumber--;
move(stepnumber,255,1000);
}
vTaskDelay(3000/portTICK_PERIOD_MS);
}
}
void led_task(void * parameters){
while(1){
digitalWrite(ledPin, HIGH); 
vTaskDelay(500/portTICK_PERIOD_MS); 
digitalWrite(ledPin, LOW); 
vTaskDelay(500/portTICK_PERIOD_MS);
}
}
void setup(){
myStepper.setSpeed(60);
pinMode(ledPin, OUTPUT);
Serial.begin(115200);

xTaskCreatePinnedToCore(
move_routine, 
"Move Routine",
8192,
NULL,
1,
NULL, 
1
);

xTaskCreatePinnedToCore(
led_task, 
"LED Task", 
1024, 
NULL, 
1, 
NULL, 
1
);
}
void loop(){
}

期望看到闪烁的led和电机转动,但没有看到

您的两个任务按照定义工作,问题是您的ledcAnalogWrite()函数,您在代码中调用ledcWrite()函数,而在代码中没有地方初始化ledcSetup()ledcAttachPin()的LEDC。

阅读LED控制(LED)的文档

最新更新