1.本信号发生器采用STM32F103C8T6作为主控,AD9833作为DDS信号发生器,代码可直接烧录
2.本信号发生器实现了方波、正弦波、三角波的输出与频率、幅度按键调控
3.另外实现了STM32定时器产生一路方波,占空比可调
STM32F103C8T6核心板
AD9833模块
单片机源程序如下:
- #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);
- // }
-
复制代码
所有资料51hei提供下载(PCB还未画完,也顺便发出来,大家有时间帮忙一起完善一下吧,东东还很不完善 大家勿喷,一起学习一起进步):
STM32&AD9833信号发生器PCB和代码.7z
(1.03 MB, 下载次数: 177)
|