Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp
- Committer:
- lukeocarwright
- Date:
- 2020-04-07
- Revision:
- 4:9b7ea5528a5c
- Parent:
- 3:b7df72682b81
- Child:
- 5:e785b9cd58c9
File content as of revision 4:9b7ea5528a5c:
/* ELEC2645 Embedded Systems Project School of Electronic & Electrical Engineering University of Leeds 2019/20 Name: Luke Cartwright Username: el18loc Student ID Number: 201225242 Start Date: 06/02/2020 Last Edited: 07/04/2020 */ // Includes #include "mbed.h" #include "Gamepad.h" #include "N5110.h" // Objects Gamepad pad; N5110 lcd; Ticker down; Ticker period; DigitalOut rca(PTC4); Serial pc(USBTX, USBRX); //Functions void startup(); void squareWave(); void wavetable(); //void sinspeak(); void down_isr(); void up_isr(); //Arrays for startup const char CART[4] = {'C','A','R','T'}; //Global Variables volatile double wavtable[4096]; //Wavetable array // all times drastically slowed to attempt debugging in teraterm float g_period = 0.002; float g_unused= g_period*1000000.0f; int g_period_us=g_unused; volatile uint64_t g_uptime_us = g_period_us/2; // placeholder value //isr interrupt flags volatile int g_upflag=1; volatile int g_downflag=1; int main() { printf("RUNNING CODE \n"); startup(); //initialises board and displays start screen wavetable(); //generates wavtable array //pad.leds_on(); squareWave(); //generates pulse wave modulated by sin wave //pad.leds_off(); //sinspeak(); } void startup() { pad.init(); //initiate Gamepad pad.leds_on(); //turn LEDS on to show starting up printf("Initialising Pad\n"); lcd.init(); //intitates screen lcd.clear(); lcd.setContrast(0.5); //contrast setting lcd.inverseMode(); //puts screen in -ve //position for CART const int x = 10; const int y = 2; //Prints CART SYNTH to display lcd.printString(CART,x,y); lcd.refresh(); wait_ms(1800); //timer to allow theme to play out lcd.clear(); lcd.refresh(); //sets clear screen pad.leds_off(); //turns of leds to show ready } void wavetable() { double sin_d[4096]; pad.leds_on(); //shows computating (debug) printf("Generating Wavetable \n"); for (int i=0; i<4096; i++) { sin_d[i] = 0.5f*sin(2.0f*PI*(i/4096.0f)); wavtable[i]= sin_d[i]+0.5; //generates wave table 0<1 in double //printf("wav[i]= %f \n", wavtable[i]); // Used for Debug } pad.leds_off(); } void squareWave() { printf("Generating SIN PWM \n"); int i=0; //int based iterator float ifl=0; //float based itterator float f=50; //frequency of sin wave produced period.attach_us(&up_isr,g_period_us); //ticker to write 1 to rca down.attach_us(&down_isr,g_uptime_us); //ticker to write 0 to rca printf("g_period_us: %d \n", g_period_us); printf("sin Frequency: %f \n", f); while (1) { //continual loop for pulse production float dutyratio = wavtable[i]; //calcualtes duty ratio of pulse g_uptime_us= dutyratio*g_period_us; //calculates duty ratio in usecs if (g_uptime_us<1) { g_uptime_us=g_period_us/100; } //sets to be value for timebeing to eliminate 0 error //float f=440*(pad.read_pot1()+1); //removed for simplification if (g_upflag==0) { ifl = ifl + (4096*f*g_period); //once rca=1 itterate sin function if (ifl>4096) { ifl= ifl-4096; } i=ifl; g_upflag=1; //reset flag //printf("iterate i: i= %d, ifl= %f \n", i, ifl); } //printf("DR: %f \n",dutyratio); //printf("sleep \n"); sleep(); //sleeps till next isr } } void down_isr() //sets rca to 0 { //printf("downISR \n"); if (g_downflag==0) {//stops error trigger rca.write(0); g_downflag=1; g_uptime_us= g_uptime_us+g_period_us; // eliminates it calling if =0 //printf("0 \n");//print only in while v. slow freguency } } void up_isr() //sets rca=1 { //printf("upISR \n"); rca.write(1); down.attach_us(&down_isr,g_uptime_us); //timer to set rca=0 after elapsed g_upflag=0; //sets flag to iterate g_downflag=0; //sets flag to allow set to 0 //printf("1 \n"); //only in while at v low frequency } /* void sinspeak () { float f1=440.0; float i=0; unsigned short v=0; int inc=0; pad.reset_buttons(); f1 = pad.read_pot1(); f1 = 440.0f+440.0f*f1; //printf("f1= %f \n",f1); // Used for Debug while (inc<3000) { int inti = i; v = o[inti]; printf("OUTPUT: %u \n", v); //pad.write_u16(v); wait_us(230); //fs= 4k Ts=250us i = i + ((4096.0f*f1)/4000.0f); //i+((samples*f)*Ts) if (i>=4096.0f) { i=i-4096.0f; } else { wait_us(3); // used to attempt note stabilisation to match other loop } inc++; } } */