Basic_sine_wave_generator

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

Committer:
taoqiuyang
Date:
Fri Nov 27 02:44:47 2015 +0000
Revision:
5:38c6ba85a6ec
Parent:
4:1b82016459ff
Child:
6:7985a531acb9
Added 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 DigitalOut dout(LED1);
taoqiuyang 0:52af3c50f548 20
taoqiuyang 3:bb920a8eb590 21 //-----Global variable used for Func_Gen---------
taoqiuyang 1:fb8f053747d6 22 const double pi = 3.14;
taoqiuyang 1:fb8f053747d6 23 float time_interv;
taoqiuyang 1:fb8f053747d6 24 int length_waveform=1000;
taoqiuyang 2:cc462c2a54f6 25 uint16_t waveform[1000];
taoqiuyang 3:bb920a8eb590 26 float x;
taoqiuyang 0:52af3c50f548 27
taoqiuyang 3:bb920a8eb590 28 //-----User Specified, change it if needed-------
taoqiuyang 4:1b82016459ff 29 int waveform_type; //0 for sine,
taoqiuyang 4:1b82016459ff 30 float freq,amp,offset,duty_cycle;
taoqiuyang 4:1b82016459ff 31
taoqiuyang 4:1b82016459ff 32 /*
taoqiuyang 4:1b82016459ff 33 sine wave use: freq,amp,offset
taoqiuyang 4:1b82016459ff 34 square wave use: freq,amp,offse and duty_cycle
taoqiuyang 4:1b82016459ff 35 */
taoqiuyang 3:bb920a8eb590 36
taoqiuyang 0:52af3c50f548 37
taoqiuyang 1:fb8f053747d6 38 void initialize_LCD(){
taoqiuyang 1:fb8f053747d6 39 lcd.baudrate(3000000);
taoqiuyang 1:fb8f053747d6 40 lcd.background_color(0);
taoqiuyang 1:fb8f053747d6 41 lcd.cls();
taoqiuyang 1:fb8f053747d6 42
taoqiuyang 1:fb8f053747d6 43 lcd.printf("Initializing...\n");
taoqiuyang 1:fb8f053747d6 44 lcd.printf("Fun Generator Demo");
taoqiuyang 1:fb8f053747d6 45 }
taoqiuyang 1:fb8f053747d6 46
taoqiuyang 3:bb920a8eb590 47 void generate_waveform_datapoints(){ //Generate data points for the waveform
taoqiuyang 2:cc462c2a54f6 48 float t=0;
taoqiuyang 1:fb8f053747d6 49 time_interv=1.0/freq/length_waveform;
taoqiuyang 2:cc462c2a54f6 50
taoqiuyang 3:bb920a8eb590 51 //------if sine wave--------
taoqiuyang 3:bb920a8eb590 52 if (waveform_type==0){
taoqiuyang 3:bb920a8eb590 53 for (int datapoint_counter=0; datapoint_counter<length_waveform; datapoint_counter++){
taoqiuyang 4:1b82016459ff 54 x=amp/3.3*cos(2*pi*freq*t)+offset/3.3;
taoqiuyang 4:1b82016459ff 55 waveform[datapoint_counter]=(uint16_t) (x*65535);
taoqiuyang 3:bb920a8eb590 56 t += time_interv;
taoqiuyang 3:bb920a8eb590 57 }
taoqiuyang 3:bb920a8eb590 58 }
taoqiuyang 3:bb920a8eb590 59
taoqiuyang 4:1b82016459ff 60 //------if square wave--------
taoqiuyang 5:38c6ba85a6ec 61 if (waveform_type==1){
taoqiuyang 4:1b82016459ff 62 for (int datapoint_counter=0; datapoint_counter<length_waveform; datapoint_counter++){
taoqiuyang 5:38c6ba85a6ec 63 if (datapoint_counter<=length_waveform*duty_cycle){
taoqiuyang 5:38c6ba85a6ec 64 x=amp/3.3+offset/3.3;
taoqiuyang 5:38c6ba85a6ec 65 }else{
taoqiuyang 5:38c6ba85a6ec 66 x=-1.0*amp/3.3+offset/3.3;
taoqiuyang 4:1b82016459ff 67 }
taoqiuyang 5:38c6ba85a6ec 68 waveform[datapoint_counter]=(uint16_t) (x*65535);
taoqiuyang 5:38c6ba85a6ec 69 }
taoqiuyang 5:38c6ba85a6ec 70 }
taoqiuyang 5:38c6ba85a6ec 71
taoqiuyang 5:38c6ba85a6ec 72 //------if ???? wave---------
taoqiuyang 5:38c6ba85a6ec 73 }
taoqiuyang 4:1b82016459ff 74
taoqiuyang 5:38c6ba85a6ec 75
taoqiuyang 3:bb920a8eb590 76
taoqiuyang 3:bb920a8eb590 77 void output_waveform_datapoints(){ //Output the data points using DAC (pin18)
taoqiuyang 3:bb920a8eb590 78 time_interv=1.0/freq/length_waveform;
taoqiuyang 2:cc462c2a54f6 79 for (int datapoint_counter=0; datapoint_counter<length_waveform; datapoint_counter++){
taoqiuyang 2:cc462c2a54f6 80 aout.write_u16(waveform[datapoint_counter]);
taoqiuyang 2:cc462c2a54f6 81 wait(time_interv);
taoqiuyang 2:cc462c2a54f6 82 }
taoqiuyang 2:cc462c2a54f6 83 }
taoqiuyang 2:cc462c2a54f6 84
taoqiuyang 1:fb8f053747d6 85
taoqiuyang 1:fb8f053747d6 86
taoqiuyang 0:52af3c50f548 87
taoqiuyang 0:52af3c50f548 88 int main(void){
taoqiuyang 5:38c6ba85a6ec 89 waveform_type=1; //0 for sine,
taoqiuyang 4:1b82016459ff 90 freq=10; //Hz
taoqiuyang 4:1b82016459ff 91 amp=0.5; //Sacle factor, 1=full range
taoqiuyang 3:bb920a8eb590 92 offset=0.5;
taoqiuyang 5:38c6ba85a6ec 93 duty_cycle=0.333;
taoqiuyang 5:38c6ba85a6ec 94
taoqiuyang 1:fb8f053747d6 95 initialize_LCD();
taoqiuyang 1:fb8f053747d6 96 generate_waveform_datapoints();
taoqiuyang 1:fb8f053747d6 97
taoqiuyang 0:52af3c50f548 98 while (1){
taoqiuyang 2:cc462c2a54f6 99 output_waveform_datapoints();
taoqiuyang 3:bb920a8eb590 100
taoqiuyang 0:52af3c50f548 101 }
taoqiuyang 0:52af3c50f548 102 }