Basic_sine_wave_generator

Dependencies:   4DGL-uLCD-SE mbed-rtos mbed

Fork of 4180_proj by ECE4180proj

Committer:
taoqiuyang
Date:
Fri Nov 27 21:31:47 2015 +0000
Revision:
9:450d5c8e91f5
Parent:
8:3d3652b8109f
debugged triangle wave generation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
taoqiuyang 3:bb920a8eb590 1 /* ECE4180 Final Project -- mbed Function Generator
taoqiuyang 3:bb920a8eb590 2
taoqiuyang 3:bb920a8eb590 3 Platform: mbed LPC-1768
taoqiuyang 3:bb920a8eb590 4
taoqiuyang 3:bb920a8eb590 5 Team member: Hanjie Xie
taoqiuyang 3:bb920a8eb590 6 Qiuyang Tao
taoqiuyang 3:bb920a8eb590 7 Xuefeng Jin
taoqiuyang 3:bb920a8eb590 8 Yuqing Peng
taoqiuyang 3:bb920a8eb590 9 */
taoqiuyang 3:bb920a8eb590 10
taoqiuyang 3:bb920a8eb590 11
taoqiuyang 0:52af3c50f548 12 #include "mbed.h"
taoqiuyang 1:fb8f053747d6 13 #include "uLCD_4DGL.h"
taoqiuyang 1:fb8f053747d6 14
taoqiuyang 3:bb920a8eb590 15 //----- Objects for devices----------------------
taoqiuyang 1:fb8f053747d6 16 Serial pc(USBTX, USBRX);
taoqiuyang 1:fb8f053747d6 17 uLCD_4DGL lcd(p13, p14, p15);
taoqiuyang 0:52af3c50f548 18 AnalogOut aout(p18);
taoqiuyang 0:52af3c50f548 19
taoqiuyang 9:450d5c8e91f5 20
taoqiuyang 9:450d5c8e91f5 21 DigitalOut led1(LED1);
taoqiuyang 9:450d5c8e91f5 22
taoqiuyang 6:7985a531acb9 23
taoqiuyang 3:bb920a8eb590 24 //-----Global variable used for Func_Gen---------
taoqiuyang 1:fb8f053747d6 25 const double pi = 3.14;
taoqiuyang 1:fb8f053747d6 26 float time_interv;
taoqiuyang 6:7985a531acb9 27 int datapoint_counter=0;
taoqiuyang 6:7985a531acb9 28 int length_waveform=100;
taoqiuyang 9:450d5c8e91f5 29 uint16_t waveform[100];
taoqiuyang 3:bb920a8eb590 30 float x;
taoqiuyang 0:52af3c50f548 31
taoqiuyang 3:bb920a8eb590 32 //-----User Specified, change it if needed-------
taoqiuyang 4:1b82016459ff 33 int waveform_type; //0 for sine,
taoqiuyang 4:1b82016459ff 34 float freq,amp,offset,duty_cycle;
taoqiuyang 4:1b82016459ff 35
taoqiuyang 4:1b82016459ff 36 /*
taoqiuyang 4:1b82016459ff 37 sine wave use: freq,amp,offset
taoqiuyang 4:1b82016459ff 38 square wave use: freq,amp,offse and duty_cycle
taoqiuyang 4:1b82016459ff 39 */
taoqiuyang 3:bb920a8eb590 40
taoqiuyang 0:52af3c50f548 41
taoqiuyang 1:fb8f053747d6 42 void initialize_LCD(){
taoqiuyang 1:fb8f053747d6 43 lcd.baudrate(3000000);
taoqiuyang 1:fb8f053747d6 44 lcd.background_color(0);
taoqiuyang 1:fb8f053747d6 45 lcd.cls();
taoqiuyang 1:fb8f053747d6 46
taoqiuyang 1:fb8f053747d6 47 lcd.printf("Initializing...\n");
taoqiuyang 1:fb8f053747d6 48 lcd.printf("Fun Generator Demo");
taoqiuyang 1:fb8f053747d6 49 }
taoqiuyang 1:fb8f053747d6 50
taoqiuyang 3:bb920a8eb590 51 void generate_waveform_datapoints(){ //Generate data points for the waveform
taoqiuyang 2:cc462c2a54f6 52 float t=0;
taoqiuyang 2:cc462c2a54f6 53
taoqiuyang 3:bb920a8eb590 54 //------if sine wave--------
taoqiuyang 3:bb920a8eb590 55 if (waveform_type==0){
taoqiuyang 6:7985a531acb9 56 for (int counter=0; counter<length_waveform; counter++){
taoqiuyang 4:1b82016459ff 57 x=amp/3.3*cos(2*pi*freq*t)+offset/3.3;
taoqiuyang 6:7985a531acb9 58 waveform[counter]=(uint16_t) (x*65535);
taoqiuyang 3:bb920a8eb590 59 t += time_interv;
taoqiuyang 3:bb920a8eb590 60 }
taoqiuyang 3:bb920a8eb590 61 }
taoqiuyang 3:bb920a8eb590 62
taoqiuyang 4:1b82016459ff 63 //------if square wave--------
taoqiuyang 5:38c6ba85a6ec 64 if (waveform_type==1){
taoqiuyang 6:7985a531acb9 65 for (int counter=0; counter<length_waveform; counter++){
taoqiuyang 6:7985a531acb9 66 if (counter<=length_waveform*duty_cycle){
taoqiuyang 5:38c6ba85a6ec 67 x=amp/3.3+offset/3.3;
taoqiuyang 5:38c6ba85a6ec 68 }else{
taoqiuyang 5:38c6ba85a6ec 69 x=-1.0*amp/3.3+offset/3.3;
taoqiuyang 4:1b82016459ff 70 }
taoqiuyang 6:7985a531acb9 71 waveform[counter]=(uint16_t) (x*65535);
taoqiuyang 5:38c6ba85a6ec 72 }
taoqiuyang 5:38c6ba85a6ec 73 }
taoqiuyang 5:38c6ba85a6ec 74
taoqiuyang 6:7985a531acb9 75 //------if triangle wave---------
taoqiuyang 6:7985a531acb9 76 if (waveform_type==2){
taoqiuyang 9:450d5c8e91f5 77 for (int counter=0; counter<length_waveform/2; counter++){
taoqiuyang 9:450d5c8e91f5 78 x=amp/1.65*(2.0*counter/length_waveform-0.5)+offset/3.3;
taoqiuyang 6:7985a531acb9 79 waveform[counter]=(uint16_t) (x*65535);
taoqiuyang 9:450d5c8e91f5 80 }
taoqiuyang 9:450d5c8e91f5 81
taoqiuyang 9:450d5c8e91f5 82 for (int counter=length_waveform/2; counter<length_waveform; counter++){
taoqiuyang 9:450d5c8e91f5 83 waveform[counter]=waveform[length_waveform-counter-1];
taoqiuyang 9:450d5c8e91f5 84 }
taoqiuyang 9:450d5c8e91f5 85
taoqiuyang 6:7985a531acb9 86 }
taoqiuyang 5:38c6ba85a6ec 87 }
taoqiuyang 4:1b82016459ff 88
taoqiuyang 5:38c6ba85a6ec 89
taoqiuyang 3:bb920a8eb590 90
taoqiuyang 3:bb920a8eb590 91 void output_waveform_datapoints(){ //Output the data points using DAC (pin18)
taoqiuyang 6:7985a531acb9 92 for (int counter=0; counter<length_waveform; counter++){
taoqiuyang 6:7985a531acb9 93 aout.write_u16(waveform[counter]);
taoqiuyang 2:cc462c2a54f6 94 wait(time_interv);
taoqiuyang 2:cc462c2a54f6 95 }
taoqiuyang 2:cc462c2a54f6 96 }
taoqiuyang 2:cc462c2a54f6 97
taoqiuyang 1:fb8f053747d6 98
taoqiuyang 6:7985a531acb9 99 void output_waveform_datapoints_timer_ISR(){ //Output the data points using DAC (pin18)
taoqiuyang 6:7985a531acb9 100 aout.write_u16(waveform[datapoint_counter]);
taoqiuyang 6:7985a531acb9 101 datapoint_counter++;
taoqiuyang 6:7985a531acb9 102
taoqiuyang 6:7985a531acb9 103 if (datapoint_counter==length_waveform-1){datapoint_counter=0;}
taoqiuyang 6:7985a531acb9 104 }
taoqiuyang 6:7985a531acb9 105
taoqiuyang 1:fb8f053747d6 106
taoqiuyang 9:450d5c8e91f5 107
taoqiuyang 9:450d5c8e91f5 108 void display_on_lod() {
taoqiuyang 9:450d5c8e91f5 109 int lcd_counter=0;
taoqiuyang 9:450d5c8e91f5 110 while (true) {
taoqiuyang 9:450d5c8e91f5 111 lcd.locate(4,4);
taoqiuyang 9:450d5c8e91f5 112 lcd.printf("%d",lcd_counter);
taoqiuyang 9:450d5c8e91f5 113 lcd_counter++;
taoqiuyang 9:450d5c8e91f5 114 }
taoqiuyang 9:450d5c8e91f5 115 }
taoqiuyang 9:450d5c8e91f5 116
taoqiuyang 9:450d5c8e91f5 117
taoqiuyang 0:52af3c50f548 118
taoqiuyang 0:52af3c50f548 119 int main(void){
taoqiuyang 9:450d5c8e91f5 120 initialize_LCD();
taoqiuyang 9:450d5c8e91f5 121
taoqiuyang 9:450d5c8e91f5 122 waveform_type=0; //0 for sine,
taoqiuyang 8:3d3652b8109f 123 freq=1000; //Hz
taoqiuyang 9:450d5c8e91f5 124 amp=1.65; //Sacle factor, 1=full range
taoqiuyang 9:450d5c8e91f5 125 offset=1.65;
taoqiuyang 9:450d5c8e91f5 126 duty_cycle=0.2;
taoqiuyang 6:7985a531acb9 127
taoqiuyang 6:7985a531acb9 128 time_interv=1.0/freq/length_waveform;
taoqiuyang 6:7985a531acb9 129
taoqiuyang 5:38c6ba85a6ec 130
taoqiuyang 1:fb8f053747d6 131 generate_waveform_datapoints();
taoqiuyang 1:fb8f053747d6 132
taoqiuyang 9:450d5c8e91f5 133
taoqiuyang 0:52af3c50f548 134 while (1){
taoqiuyang 7:ed28d978f18d 135 output_waveform_datapoints();
taoqiuyang 0:52af3c50f548 136 }
taoqiuyang 0:52af3c50f548 137 }