0

I am working on a project where I have to use multi-threading to generate multiple pwms. I am working on raspberry and I use WiringPI to generate softPWMs.

The problems is my raspberry does not want to generate 5 PWMs. Each time a run the code, the PWMs are generated randomly on 3 of the five pins I have setted. I do not know if it is the OS putting some threads on sleep or not.

I have no idea where the problem might be from. In fact, I tries using the same code to send periodically send many variable and it did work. But when I try using the same code with PWM it does not work. The code I am using is right below. If any of you has any idea please help

#include <wiringPi.h> 
#include <stdio.h>    
#include <softPwm.h> 
#include <stdlib.h>
#include <pthread.h>

#define THREAD_NUM 1



struct thArg{
    int PWM_pin1;
    int rapportCyclique1;
    int PWM_pin2;
    int rapportCyclique2;
    int PWM_pin3;
    int rapportCyclique3;
    int PWM_pin4;
    int rapportCyclique4;
    
};

struct thArg data = {
    22,20,
    23,40,
    24,80,  
    25,60
};



void* routine(void* args){



    //int PWM_pin = *(int*)args->PWM_pin;
    //int intensity = *(int*)args->rapportCyclique;
    //pthread_mutex_lock(&mutexBuffer);
    struct thArg *arrgs = (struct thArg *) args;
    int PWM_pin1 = arrgs->PWM_pin1;
    int rapportCyclique1 = arrgs->rapportCyclique1;
    int PWM_pin2 = arrgs->PWM_pin2;
    int rapportCyclique2 = arrgs->rapportCyclique2;
    int PWM_pin3 = arrgs->PWM_pin3;
    int rapportCyclique3 = arrgs->rapportCyclique3;
    int PWM_pin4 = arrgs->PWM_pin4;
    int rapportCyclique4 = arrgs->rapportCyclique4;

    pinMode(PWM_pin1, OUTPUT);
    softPwmCreate(PWM_pin1, 1, 100);
    pinMode(PWM_pin2, OUTPUT);
    softPwmCreate(PWM_pin1, 1, 100);
    pinMode(PWM_pin3, OUTPUT);
    softPwmCreate(PWM_pin1, 1, 100);
    pinMode(PWM_pin4, OUTPUT);
    softPwmCreate(PWM_pin1, 1, 100);

    softPwmWrite(PWM_pin1, rapportCyclique1);
    softPwmWrite(PWM_pin2, rapportCyclique2);
    softPwmWrite(PWM_pin3, rapportCyclique3);
    softPwmWrite(PWM_pin4, rapportCyclique4);
      
    //pthread_mutex_unlock(&mutexBuffer);

}

void* routine(void*);

int main(int argc, char** argv)
{
    wiringPiSetup();
    pthread_t th[THREAD_NUM];
    for(int i=0; i<THREAD_NUM; i++)
    {
        struct thArg *a = malloc(sizeof(struct thArg));
        *a = data;
        if(pthread_create(&th[i], NULL, &routine, a) != 0)
        {
            perror("failed to create thread\n");
            exit( EXIT_FAILURE );
        } 
    }

    for(int i = 0; i<THREAD_NUM; i++){
        if(pthread_join(th[i], NULL)!= 0)
        {
            perror("Failed to join thread\n");
            exit( EXIT_FAILURE );
        }
    }
    
    //pthread_mutex_destroy(&mutexBuffer);
    return EXIT_SUCCESS;

}
Gerhardh
  • 11,688
  • 4
  • 17
  • 39

0 Answers0