Basic_sine_wave_generator

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

Committer:
taoqiuyang
Date:
Fri Nov 27 03:20:17 2015 +0000
Revision:
6:7985a531acb9
Parent:
5:38c6ba85a6ec
Child:
7:ed28d978f18d
output waveform using timer

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