PWM - PM
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "driverlib/pin_map.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/debug.h"
#include "driverlib/pwm.h"
#include "inc/hw_gpio.h"
#include "driverlib/rom.h"
#define GPIO_PINS_ALL GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
void playSound(uint32_t frequency, uint32_t duration, float volume){
uint32_t PWMclock = ROM_SysCtlClockGet() / 4 ; // get the current PWM clock value -- dzielimy przez dzielnik
uint32_t period = (PWMclock/frequency) - 1; // calculate the period for PWM signal -- odejmujemy jeden bo liczy od 0
float numOfCyc = ROM_SysCtlClockGet()/1000.0; // calculate number of cycles per ms
uint32_t counter = duration * numOfCyc / 3; //calculate the counter for SysCtlDelay function;
ROM_PWMGenPeriodSet(PWM1_BASE, PWM_GEN_1, period); // set the period of the PWM signal -- ustawienie okresu
// Set the pulse width of PWM1 for a 50% duty cycle:
ROM_PWMPulseWidthSet(PWM1_BASE, PWM_OUT_2, volume * period); // ustawiamy wspolczynnik wypelnienia
ROM_PWMOutputState(PWM1_BASE, PWM_OUT_2_BIT, true); // wlaczenie wyjscia nr 2 generatora 1 modulu PWM1
ROM_PWMGenEnable(PWM1_BASE, PWM_GEN_1); // uruchomienie generatora
ROM_SysCtlDelay(counter); // add delay
ROM_PWMGenDisable(PWM1_BASE, PWM_GEN_1); // wylaczenie generatora
}
int main(void){
uint32_t fstart = 440;
uint32_t fstep = 20;
uint32_t fstop = 880;
uint32_t frequency = fstart;
float startVolume = 0.5;
float minVolume = 0.001;
float maxVolume = 0.9;
float volume = startVolume;
ROM_SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); // Set the clocking to run directly from the crystal.
ROM_SysCtlPWMClockSet(SYSCTL_PWMDIV_4);// Ustawienie zegara PWM, dzielnik PWM = 4, dzielnik zegara = 5 ==> (200 MHz / 5) / 4 = 10 MHz
// ROM_SysCtlDelay(ROM_SysCtlClockGet() / 2);
// wlaczenie GPIO i PWM
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1); // Wlaczenie pierwszego modulu PWM
ROM_GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PINS_ALL);
ROM_GPIOPinTypeGPIOInput(GPIO_PORTH_BASE, GPIO_PINS_ALL);
ROM_GPIOPinTypeGPIOInput(GPIO_PORTJ_BASE, GPIO_PINS_ALL);
//Konfiguracja linii -- buzzer linia PA6, do linii PA6 podlaczone jest wyjscie nr 2 pierwszego generatora modulu PWM1
ROM_PWMGenConfigure(PWM1_BASE, PWM_GEN_1, PWM_GEN_MODE_DOWN); // Konfiguracja generatora, ustawiamy pierwszy z czterech generator�w modu�u PWM1, tryb zliczania w d�
ROM_GPIOPinConfigure(GPIO_PA6_M1PWM2); // polaczenie linii PA6 z wyjsciem nr 2 generatora 1 modulu PWM1
ROM_GPIOPinTypePWM(GPIO_PORTA_BASE, GPIO_PIN_6); // ustawia typ linii PA6 na PWM
for (;;){
if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_0) == GPIO_PIN_0){ // A4 -> zwiększanie częstotliwości
frequency += fstep;
if(frequency > fstop) frequency = fstop;
playSound(frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_4) == GPIO_PIN_4){ // A0 -> zmniejszanie częstotliwości
frequency -= fstep;
if(frequency < fstart) frequency = fstart;
playSound(frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_3) == GPIO_PIN_3){ // A3 -> podgłaszanie
volume += 0.001;
if(volume > maxVolume) volume = maxVolume;
playSound(frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_7) == GPIO_PIN_7){ // A7 -> przyciszanie
volume = 0.001;
if(volume < minVolume) volume = minVolume;
playSound(frequency, 500, volume);
}
// play the melody
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_0) == GPIO_PIN_0){
playSound(450+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_1) == GPIO_PIN_1){
playSound(500+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_2) == GPIO_PIN_2){
playSound(550+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_3) == GPIO_PIN_3){
playSound(600+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_4) == GPIO_PIN_4){
playSound(650+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_5) == GPIO_PIN_5){
playSound(700+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_6) == GPIO_PIN_6){
playSound(750+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTH_BASE, GPIO_PIN_7) == GPIO_PIN_7){
playSound(800+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_0) == GPIO_PIN_0){
playSound(450+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_1) == GPIO_PIN_1){
playSound(500+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_2) == GPIO_PIN_2){
playSound(550+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_3) == GPIO_PIN_3){
playSound(600+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_4) == GPIO_PIN_4){
playSound(650+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_5) == GPIO_PIN_5){
playSound(700+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_6) == GPIO_PIN_6){
playSound(750+frequency, 500, volume);
}
if(GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_7) == GPIO_PIN_7){
playSound(800+frequency, 500, volume);
}
}
return 0;
}