Untitled

 avatar
unknown
plain_text
a month ago
4.3 kB
3
Indexable
#include <unistd.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include "scheduler.h"
/* Driver Header files */
#include <ti/drivers/PWM.h>
#include <ti/drivers/ADC.h>
#include <ti/drivers/UART.h>
#include <ti/drivers/GPIO.h>

/* Example/Board Header files */
#include "Board.h"

/* Frequency range (in Hz) */
#define FREQ_MIN 10     // Minimum frequency (10 Hz)
#define FREQ_MAX 100    // Maximum frequency (100 Hz)

/* Duty cycle range (0% to 100%) */
#define DUTY_MIN 10
#define DUTY_MAX 100

tCB taskList[TASK_COUNT];  // Task list for scheduler

/* Global Variables */
uint32_t freq;        // PWM frequency in Hz
uint32_t duty;        // PWM duty cycle in %
uint16_t adcValue1;   // ADC value for frequency
uint16_t adcValue2;   // ADC value for duty cycle
ADC_Handle adc1, adc2;  // Global ADC handles
PWM_Handle pwm1;        // Global PWM handle
UART_Handle uart;       // Global UART handle

/* Function Prototypes */
void readADCValues(void);      // Task 1: Read ADC
void updatePWMOutput(void);    // Task 2: Update PWM
void sendPWMDutyAndFreq(void); // Task 3: Send PWM data over UART
void systemHeartbeat(void);  // Task: System Heartbeat


void *mainThread(void *arg0)
{
    PWM_Params pwmParams;
    ADC_Params adcParams;
    UART_Params uartParams;

    /* Initialize drivers */
    PWM_init();
    ADC_init();
    UART_init();
    GPIO_init();

    /* Set up ADCs */
    ADC_Params_init(&adcParams);
    adc1 = ADC_open(Board_ADC0, &adcParams);
    if (adc1 == NULL) {
        while (1);  // ADC0 failed to open
    }

    adc2 = ADC_open(Board_ADC1, &adcParams);
    if (adc2 == NULL) {
        while (1);  // ADC1 failed to open
    }

    /* Set up PWM */
    PWM_Params_init(&pwmParams);
    pwmParams.dutyUnits = PWM_DUTY_FRACTION;  // Use fractional units for duty cycle
    pwmParams.dutyValue = 0;                  // Start with 0% duty cycle
    pwmParams.periodUnits = PWM_PERIOD_HZ;    // Frequency in Hz
    pwmParams.periodValue = FREQ_MIN;         // Start with the minimum frequency

    pwm1 = PWM_open(Board_PWM0, &pwmParams);
    if (pwm1 == NULL) {
        while (1);  // PWM0 failed to open
    }
    PWM_start(pwm1);
    GPIO_setConfig(Board_GPIO_LED1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /* Set up UART */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.baudRate = 115200;
    uart = UART_open(Board_UART0, &uartParams);
    if (uart == NULL) {
        while (1);  // UART failed to open
    }

    /* Initialize GPIO for LED */
    GPIO_setConfig(Board_GPIO_LED0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /* Initialize Tasks */
    taskList[0] = initTask(systemHeartbeat, 20, 0, true);         // Blink LED 5 times, one-time task 
    taskList[1] = initTask(readADCValues, 5, 0, true);         // Read ADC values every cycle
    taskList[2] = initTask(updatePWMOutput, 5, 1, true);       // Update PWM output every cycle, delayed by 1
    taskList[3] = initTask(sendPWMDutyAndFreq, 10, 0, true);    // Send PWM data over UART every 2 cycles

    /* Scheduler Loop */
    while (1) {
        scheduler();
        usleep(50000);  // Run scheduler every 50 ms
    }
}

/* Task 1: Read ADC Values */
void readADCValues(void) {
    if (ADC_convert(adc1, &adcValue1) == ADC_STATUS_SUCCESS) {
        // Scale ADC value for frequency in Hz
        freq = FREQ_MIN + ((FREQ_MAX - FREQ_MIN) * adcValue1 / 4095);
    }

    if (ADC_convert(adc2, &adcValue2) == ADC_STATUS_SUCCESS) {
        // Scale ADC value for duty cycle in %
        duty = DUTY_MIN + ((DUTY_MAX - DUTY_MIN) * adcValue2 / 4095);
    }
}

/* Task 2: Update PWM Output */
void updatePWMOutput(void) {
    PWM_setPeriod(pwm1, freq);                                     // Update PWM frequency
    PWM_setDuty(pwm1, duty * (PWM_DUTY_FRACTION_MAX / 100));  // Update PWM duty cycle
}

/* Task 3: Send PWM Duty and Frequency Over UART */
void sendPWMDutyAndFreq(void) {
    char uartBuffer[50];
    int len = snprintf(uartBuffer, sizeof(uartBuffer), "Freq: %lu Hz, Duty: %lu%%\r\n", freq, duty);
    UART_write(uart, uartBuffer, len);
}

void systemHeartbeat(void) {
    GPIO_toggle(Board_GPIO_LED1);  // Toggle the LED on DIO7
}


Leave a Comment