Beispiel #1
0
int pwm_on(int num, int letter, int period_freq, int dutyCycle){
	if(set_pin_mux(num,letter) != 0){
		return -1;
	}
	set_pwm_value(num,letter,"run",1);
	set_pwm_value(num,letter,"duty_percent",0);
	set_pwm_value(num,letter,"period_freq",period_freq);
	set_pwm_value(num,letter,"duty_percent",dutyCycle);

	return 0;
}
Beispiel #2
0
void setup_pwm()
{ 
    // R_FORWARD on P3.4
    init_pwm(&TB1CTL);
  
    set_pwm_resolution(&TB1CCR0, PWM_RES);
    set_pwm_value(&TB1CCR1, PWM_RES / DIVIDE_BY_TWO);
    set_pwm_output(&TB1CCTL1);
    
    P3DIR |= R_FORWARD;
    P3SEL0 |= R_FORWARD;
    P3SEL1 &= ~R_FORWARD;   
    
    start_pwm(&TB1CTL);
    
    // L_FORWARD on P3.6
    init_pwm(&TB2CTL);
  
    set_pwm_resolution(&TB2CCR0, PWM_RES);
    set_pwm_value(&TB2CCR1, PWM_RES / DIVIDE_BY_TWO);
    set_pwm_output(&TB2CCTL1);
    
    P3DIR |= L_FORWARD;
    P3SEL0 |= L_FORWARD;
    P3SEL1 &= ~L_FORWARD;   
    
    start_pwm(&TB2CTL);
    
    // R_REVERSE on P3.5  
    set_pwm_value(&TB1CCR2, PWM_RES / DIVIDE_BY_TWO);
    set_pwm_output(&TB1CCTL2);
    
    P3DIR |= R_REVERSE;
    P3SEL0 |= R_REVERSE;
    P3SEL1 &= ~R_REVERSE;   
    
    // L_REVERSE on P3.7 
    set_pwm_value(&TB2CCR2, PWM_RES / DIVIDE_BY_TWO);
    set_pwm_output(&TB2CCTL2);
    
    P3DIR |= L_REVERSE;
    P3SEL0 |= L_REVERSE;
    P3SEL1 &= ~L_REVERSE;   
}
Beispiel #3
0
void PCA9685::process()
{
    QLOG_TOPIC("PCA9685::process");

    auto i2c = m_i2c.lock();
    if (!i2c)
    {
        return;
    }

    for (size_t i = 0; i < m_pwm_channels.size(); i++)
    {
        auto& ch = m_pwm_channels[i];
        auto stream = ch.stream.lock();
        if (stream)
        {
            auto const& samples = stream->get_samples();
            if (!samples.empty())
            {
                set_pwm_value(*i2c, i, samples.back().value);
            }
        }
    }
}
Beispiel #4
0
int pwm_stop(int num, int letter){
	set_pwm_value(num,letter,"run",0);
}
Beispiel #5
0
int pwm_update_frequency(int num, int letter, int period_freq){
	set_pwm_value(num,letter,"duty_percent",0);
	set_pwm_value(num,letter,"period_freq",period_freq);
}
Beispiel #6
0
int pwm_update_duty_cycle(int num, int letter, int dutyCycle){
	set_pwm_value(num,letter,"duty_percent",dutyCycle);
}
Beispiel #7
0
int main( int argc, const char** argv ) {

	// Initialisation (prend au moins une seconde à cause du pwm)
	init_all();

	// Variables;
	int isButtonFree = 1;
	int buttonPreviouslyPushed = 0;
	int mode = 0;
	int sliderValue = 0;
	int posInTab = 0;
	int posWhenReadingTab = 0;
	char* tab = malloc(SIZE_EEPROM);
	char* readingTab = malloc(SIZE_EEPROM);
	int isReadingTabInitalized = 0;

	// Affiche le mode 1 (mode = 0)
	setLedMode(mode);

    while (1) {
		// On lit la valeur du bouton
		isButtonFree = read_button();

		// On regarde si le bouton est appuyé, s'il est appuyé on met buttonPreviouslyPushed à 1
		if(!isButtonFree) {
			buttonPreviouslyPushed = 1;
		}

		// Si on a relaché le bouton (buttonPreviouslyPushed mais le bouton n'est plus activé maintenant)
		if(buttonPreviouslyPushed && isButtonFree){
			// On remet le boolean à 0
			buttonPreviouslyPushed = 0;
			// Si on etait en mode numero 3 (mode = 2), on enregistre dans l'eeprom le tableau
			if(mode == 2) {
				write_eeprom(tab, posInTab, 0);
			}
			// On change le mode
			mode++;
			mode %= 4;
			setLedMode(mode);
		}

		// Si on est sur le mode 1
		if(mode == 0) {
			sliderValue = read_slider();
			set_pwm_value(1000000+sliderValue);
		}

		// Si on est sur le mode 3
		if(mode == 2) {
			sliderValue = read_slider();
			set_pwm_value(1000000+sliderValue);
			// notre sliderValue est entre 0 et 1 000 000, on la convertie en angle
			tab[posInTab] = convertToAngle(sliderValue);
			posInTab++;
			tab[posInTab] = 127;
			// Si on arrive au maximum on change de mode
			if(posInTab >= SIZE_EEPROM - 1 ) {
				buttonPreviouslyPushed = 1;
			}
			// Attente de 50ms pour le mode 3 uniquement
	        usleep(50000);
		}

		// Si on est sur le mode 4
		if(mode == 3) {
			// On lit l'eeprom une seule fois
			if(!isReadingTabInitalized) {
				printf("Lecture de l'eeprom ... ");
	 			read_eeprom(readingTab, posInTab);
				printf("end\n");
				isReadingTabInitalized = 1;
			}
			// On dit au servo de se déplacer à l'angle
			cmd_servo_hard(readingTab[posWhenReadingTab]);

			// On parcourt le tableau, si on atteint le max ou que on trouve 127 on repart à 0
			posWhenReadingTab++;
			if(posWhenReadingTab >= posInTab || readingTab[posWhenReadingTab] == 127) {
				posWhenReadingTab = 0;
				printf("On recommence !\n");
				// Le message de ce printf s'accumule et tous les messages ne s'affichent que au changement de mode
			}
			// Attente de 50ms pour le mode 4 uniquement
	        usleep(50000);
		}

		// Temps de pause dans la boucle infinie pour alleger le processeur
		// Evite egalement les rebonds du bouton
        usleep(1000);
    }
}