本信号发生器采用STM32F103C8T6作为主控,AD9833作为DDS信号发生器,代码可直接烧录!本信号发生器实现了方波、正弦波、三角波的输出与频率、幅度按键调控,另外实现了STM32定时器产生一路方波,占空比可调.
PCB底板如下:
源码如下:
#include "stm32f10x.h" #include "led.h" #include "ad9833.h" #include "systemconfig.h" #include "key.h" #include "oled.h" #include "bsp_i2c_gpio.h" #include "delay.h" #include "usart.h" #include "timer.h" void Delay(u32 count) { u32 i=0; for(;i<count;i++); } int main(void) { u8 i; uint16_t pwm = 400; LED_Init(); delay_init(); OLED_Init(); /* OLED初始化 */ uart_init(115200); SystemConfiguration(); //系统初始化 TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khz AD9833_Init_GPIO(); //AD9833 GPIO 初始化 //AD9833_WaveSeting(8000000.5,0,TRI_WAVE,0 );//1.0005KHz,频率寄存器0,三角波输出 ,初相位0 /*AD9833_WaveSeting(5000,0,SQU_WAVE,90); //5KHz, 频率寄存器0,方波输出 ,初相位90 */ /*AD9833_WaveSeting(100000,0,SIN_WAVE,0 );//100KHz, 频率寄存器0,正弦波输出 ,初相位0 */ AD9833_WaveSeting(10000,0,SIN_WAVE,0 ); AD9833_AmpSet(100); //设置幅值,幅值最大 255 u16 f=1000; u16 l=100; u8 flag;u8 flag1; u8 t = '0'; u16 b; u16 m=0; u16 a=0; while(1) { TIM_SetCompare2(TIM3,pwm); OLED_Clear(); OLED_DisplayUpdate(); t = KEY_Scan(); //得到键值 switch(t) //波形检测 { case '1':t='0';SystemConfiguration(); AD9833_WaveSeting(f,0,TRI_WAVE,0 );break;//说明PB4接收到低电平,第一行第一列对应第一个按键 case '5':t='0';SystemConfiguration(); AD9833_WaveSeting(f,0,SQU_WAVE,90);break; case '9':t='0';SystemConfiguration(); AD9833_WaveSeting(f,0,SIN_WAVE,0 );break; case '2':t='0';f--;SystemConfiguration(); AD9833_WaveSeting(f,0,SIN_WAVE,0 );break; case '3':t='0';f=f-10;SystemConfiguration(); AD9833_WaveSeting(f,0,SIN_WAVE,0 );break; case '4':t='0';f=f-100;SystemConfiguration(); AD9833_WaveSeting(f,0,SQU_WAVE,0 );break; case '6':t='0';f++;SystemConfiguration(); AD9833_WaveSeting(f,0,SIN_WAVE,0 );break; case '7':t='0';f=f+10;SystemConfiguration(); AD9833_WaveSeting(f,0,SIN_WAVE,0 );break; case '8':t='0';f=f+100;SystemConfiguration(); AD9833_WaveSeting(f,0,SIN_WAVE,0 );break; case 'f':t='0';pwm=pwm-10; break; case 'g':t='0';pwm=pwm+10; break; default:break; } } } // switch(t) // { // case 'g': // { // a=0; // b=0; // delay_ms(1000); //延时 // flag = KEY_Scan(); // while(flag!='d') // { // if(flag!='0'&&flag!=flag1) // { // flag=flag1; // switch(flag) // { // m++; // case '4': b=1;break; // case '3': b=2;break; // case '2': b=3;break; // case '8': b=4;break; // case '7': b=5;break; // case '6': b=6;break; // case 'c': b=7;break; // case 'b': b=8;break; // case 'a': b=9;break; // case 'e': b=0;break; // default:break; // } // } // for(u16 n=0;n<m;n++) // { // a=a+10*b; // } // flag1 = KEY_Scan(); // } // f=a; // } // case 'f': // { // a=0; // b=0; // delay_ms(1000); //延时 // flag = KEY_Scan(); // while(flag!='d') // { // if(flag!='0') // { // switch(flag) // { // m++; // case '4': b=1;break; // case '3': b=2;break; // case '2': b=3;break; // case '8': b=4;break; // case '7': b=5;break; // case '6': b=6;break; // case 'c': b=7;break; // case 'b': b=8;break; // case 'a': b=9;break; // case 'e': b=0;break; // default:break; // } // } // for(u16 n=0;n<m;n++) // { // a=a+10*b; // } // flag = KEY_Scan(); // } // l=a; // } // default:break; // } //显示2个数字 //x,y :起点坐标 //len :数字的位数 //size:字体大小 //mode:模式 0,填充模式;1,叠加模式 //num:数值(0~4294967295); // OLED_ShowNum(48,3,f,10,6); // OLED_ShowNum(0,4,l,10,6); // }