Basic_sine_wave_generator

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

Committer:
taoqiuyang
Date:
Fri Nov 27 20:31:59 2015 +0000
Revision:
8:3d3652b8109f
Parent:
7:ed28d978f18d
Child:
9:450d5c8e91f5
Tested output for 1000Hz square wave

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 6:7985a531acb9 20 //
taoqiuyang 7:ed28d978f18d 21 //Ticker output_trigger;
taoqiuyang 6:7985a531acb9 22
taoqiuyang 3:bb920a8eb590 23 //-----Global variable used for Func_Gen---------
taoqiuyang 1:fb8f053747d6 24 const double pi = 3.14;
taoqiuyang 1:fb8f053747d6 25 float time_interv;
taoqiuyang 6:7985a531acb9 26 int datapoint_counter=0;
taoqiuyang 6:7985a531acb9 27 int length_waveform=100;
taoqiuyang 6:7985a531acb9 28 uint16_t waveform[10];
taoqiuyang 3:bb920a8eb590 29 float x;
taoqiuyang 0:52af3c50f548 30
taoqiuyang 3:bb920a8eb590 31 //-----User Specified, change it if needed-------
taoqiuyang 4:1b82016459ff 32 int waveform_type; //0 for sine,
taoqiuyang 4:1b82016459ff 33 float freq,amp,offset,duty_cycle;
taoqiuyang 4:1b82016459ff 34
taoqiuyang 4:1b82016459ff 35 /*
taoqiuyang 4:1b82016459ff 36 sine wave use: freq,amp,offset
taoqiuyang 4:1b82016459ff 37 square wave use: freq,amp,offse and duty_cycle
taoqiuyang 4:1b82016459ff 38 */
taoqiuyang 3:bb920a8eb590 39
taoqiuyang 0:52af3c50f548 40
taoqiuyang 1:fb8f053747d6 41 void initialize_LCD(){
taoqiuyang 1:fb8f053747d6 42 lcd.baudrate(3000000);
taoqiuyang 1:fb8f053747d6 43 lcd.background_color(0);
taoqiuyang 1:fb8f053747d6 44 lcd.cls();
taoqiuyang 1:fb8f053747d6 45
taoqiuyang 1:fb8f053747d6 46 lcd.printf("Initializing...\n");
taoqiuyang 1:fb8f053747d6 47 lcd.printf("Fun Generator Demo");
taoqiuyang 1:fb8f053747d6 48 }
taoqiuyang 1:fb8f053747d6 49
taoqiuyang 3:bb920a8eb590 50 void generate_waveform_datapoints(){ //Generate data points for the waveform
taoqiuyang 2:cc462c2a54f6 51 float t=0;
taoqiuyang 2:cc462c2a54f6 52
taoqiuyang 3:bb920a8eb590 53 //------if sine wave--------
taoqiuyang 3:bb920a8eb590 54 if (waveform_type==0){
taoqiuyang 6:7985a531acb9 55 for (int counter=0; counter<length_waveform; counter++){
taoqiuyang 4:1b82016459ff 56 x=amp/3.3*cos(2*pi*freq*t)+offset/3.3;
taoqiuyang 6:7985a531acb9 57 waveform[counter]=(uint16_t) (x*65535);
taoqiuyang 3:bb920a8eb590 58 t += time_interv;
taoqiuyang 3:bb920a8eb590 59 }
taoqiuyang 3:bb920a8eb590 60 }
taoqiuyang 3:bb920a8eb590 61
taoqiuyang 4:1b82016459ff 62 //------if square wave--------
taoqiuyang 5:38c6ba85a6ec 63 if (waveform_type==1){
taoqiuyang 6:7985a531acb9 64 for (int counter=0; counter<length_waveform; counter++){
taoqiuyang 6:7985a531acb9 65 if (counter<=length_waveform*duty_cycle){
taoqiuyang 5:38c6ba85a6ec 66 x=amp/3.3+offset/3.3;
taoqiuyang 5:38c6ba85a6ec 67 }else{
taoqiuyang 5:38c6ba85a6ec 68 x=-1.0*amp/3.3+offset/3.3;
taoqiuyang 4:1b82016459ff 69 }
taoqiuyang 6:7985a531acb9 70 waveform[counter]=(uint16_t) (x*65535);
taoqiuyang 5:38c6ba85a6ec 71 }
taoqiuyang 5:38c6ba85a6ec 72 }
taoqiuyang 5:38c6ba85a6ec 73
taoqiuyang 6:7985a531acb9 74 //------if triangle wave---------
taoqiuyang 6:7985a531acb9 75 if (waveform_type==2){
taoqiuyang 6:7985a531acb9 76 for (int counter=0; counter<length_waveform; counter++){
taoqiuyang 6:7985a531acb9 77 if (counter<=length_waveform*duty_cycle){
taoqiuyang 6:7985a531acb9 78 x=amp/3.3+offset/3.3;
taoqiuyang 6:7985a531acb9 79 }else{
taoqiuyang 6:7985a531acb9 80 x=-1.0*amp/3.3+offset/3.3;
taoqiuyang 6:7985a531acb9 81 }
taoqiuyang 6:7985a531acb9 82 waveform[counter]=(uint16_t) (x*65535);
taoqiuyang 6:7985a531acb9 83 }
taoqiuyang 6:7985a531acb9 84 }
taoqiuyang 5:38c6ba85a6ec 85 }
taoqiuyang 4:1b82016459ff 86
taoqiuyang 5:38c6ba85a6ec 87
taoqiuyang 3:bb920a8eb590 88
taoqiuyang 3:bb920a8eb590 89 void output_waveform_datapoints(){ //Output the data points using DAC (pin18)
taoqiuyang 6:7985a531acb9 90 for (int counter=0; counter<length_waveform; counter++){
taoqiuyang 6:7985a531acb9 91 aout.write_u16(waveform[counter]);
taoqiuyang 2:cc462c2a54f6 92 wait(time_interv);
taoqiuyang 2:cc462c2a54f6 93 }
taoqiuyang 2:cc462c2a54f6 94 }
taoqiuyang 2:cc462c2a54f6 95
taoqiuyang 1:fb8f053747d6 96
taoqiuyang 6:7985a531acb9 97 void output_waveform_datapoints_timer_ISR(){ //Output the data points using DAC (pin18)
taoqiuyang 6:7985a531acb9 98 aout.write_u16(waveform[datapoint_counter]);
taoqiuyang 6:7985a531acb9 99 datapoint_counter++;
taoqiuyang 6:7985a531acb9 100
taoqiuyang 6:7985a531acb9 101 if (datapoint_counter==length_waveform-1){datapoint_counter=0;}
taoqiuyang 6:7985a531acb9 102 }
taoqiuyang 6:7985a531acb9 103
taoqiuyang 1:fb8f053747d6 104
taoqiuyang 0:52af3c50f548 105
taoqiuyang 0:52af3c50f548 106 int main(void){
taoqiuyang 5:38c6ba85a6ec 107 waveform_type=1; //0 for sine,
taoqiuyang 8:3d3652b8109f 108 freq=1000; //Hz
taoqiuyang 4:1b82016459ff 109 amp=0.5; //Sacle factor, 1=full range
taoqiuyang 3:bb920a8eb590 110 offset=0.5;
taoqiuyang 6:7985a531acb9 111 duty_cycle=0.4;
taoqiuyang 6:7985a531acb9 112
taoqiuyang 6:7985a531acb9 113 time_interv=1.0/freq/length_waveform;
taoqiuyang 6:7985a531acb9 114
taoqiuyang 5:38c6ba85a6ec 115
taoqiuyang 1:fb8f053747d6 116 initialize_LCD();
taoqiuyang 1:fb8f053747d6 117 generate_waveform_datapoints();
taoqiuyang 1:fb8f053747d6 118
taoqiuyang 6:7985a531acb9 119
taoqiuyang 6:7985a531acb9 120 //-----output waveform--------
taoqiuyang 7:ed28d978f18d 121 //output_trigger.attach(&output_waveform_datapoints_timer_ISR, time_interv);
taoqiuyang 0:52af3c50f548 122 while (1){
taoqiuyang 7:ed28d978f18d 123 output_waveform_datapoints();
taoqiuyang 0:52af3c50f548 124 }
taoqiuyang 0:52af3c50f548 125 }