【报名阶段需要填写的内容】
1. 参赛者姓名(必填项):谢泽雄
2. 单位或学校名称(必填项):安徽建筑大学城市建设学院
3. 当前职务或职称(必填项):学生
4. 参赛作品的名字(必填项):基于STM32波形发生器
5. 简要陈述您的idea和作品(必填项):利用stm32芯片自带DA产生波形且幅度可调
6. 拟用到的立创商城在售物料(必填项):STM32f103rct6主控
7. 拟用到的非立创商城物料或其它补充(必填项):TFT彩屏,晶振等
【作品正式发表(报名成功后进入设计阶段)需要填写的内容】
一、作品简介
1.本设计采用STM32为控制新芯片,利用内部DA能够产生方波,三角波,锯齿波等多种波形,且幅度可调。
2.波形能够在彩屏上显示同时通过引脚输出,设置电压过程通过全触屏操作,减少了外部电路设计。
二、系统构架图
用流程图或思维导图等形式,描述您的作品的组成构架,即方案图。
三、硬件部分的描述
1.附上原理图&PCB实物图的图片或者源文件(官方建议大家尽量用源文件上传),如果是图片,请确保图片是清晰可辨的;
2.用文字把该作品的实现原理、系统的工作过程大致讲解一下。
本设计采用STM32为控制芯片,利用内部DA电平翻转产生方波,三角波,锯齿波等多种波形,且幅度可调。
PCB和原理图.zip
四、材料清单(BOM列表)
列出您这个作品所用到的主要器件(关键器件即可),比如单片机&ARM芯片、专用集成芯片(ASIC)、传感器、功能模块等。
如果所列出的芯片是来自我们立创商城上的,最好能写出该器件的商品编号或附上对应购买链接。
1.STM32F103RCT6 http://www.szlcsc.com/product/details_8815.html
2.2.8寸TFT彩屏
五、软件部分的描述(选填)
如果您的作品涉及到软件,请列出作品对应的软件工作流程图,及关键部分的例程、源码(如果您想开源的话请上传全部源码)。
核心代码如下:
void keypress()
{
key=py_get_keynum(0,160);//获取按键值
key1=KEY_Scan(0);
switch(key1)//独立按键扫描
{
case KEY0_PRES:
sinx=1;
break;
}
if((key==15)&&(setvflag==0))//如果电压设置键按下且电压未设置好
{
LCD_Fill(0,0,240,140,BLACK);//清除显示
Show_Str(60,70,200,16,"请重新设置电压",16,1);
while(high)
{
key=py_get_keynum(0,160);//获取按键值
if(key==17)//删除键
{
if(inputlen)inputlen--;
inputstr[inputlen]='\0';//添加结束符
}
else if((key>=1)&&(key<=10))//数字0~9
{
inputstr[inputlen]=key-1;//输入字符
if(inputlen<5)inputlen++;
}
vh=inputstr[0]*1000+inputstr[1]*100+inputstr[2]*10+inputstr[3];//电压数字量保存起来
LCD_ShowxNum(48,142,inputstr[0],1,16,0); //显示电压值整数部分
LCD_ShowxNum(64,142,vh%1000,3,16,0); //显示电压值的小数部分
if(key==16)//ok键按下
{
high=0;
low=1;
Show_Str(0,120,200,16,"上限设置完成",16,1);
}
}//设置上限结束
memset(inputstr,0,7); //全部清零
inputlen=0;
key=0;
while(low&&(high==0))//下限未设置且上限设置好
{
key=py_get_keynum(0,160);//获取按键值
if(key==17)//删除键
{
if(inputlen)inputlen--;
inputstr[inputlen]='\0';//添加结束符
}
else if((key>=1)&&(key<=10))//数字0~9
{
inputstr[inputlen]=key-1;//输入字符
if(inputlen<5)inputlen++;
}
vl=inputstr[0]*1000+inputstr[1]*100+inputstr[2]*10+inputstr[3];//电压数字量保存起来
LCD_ShowxNum(176,142,inputstr[0],1,16,0); //显示电压值整数部分
LCD_ShowxNum(192,142,vl%1000,3,16,0); //显示电压值的小数部分
if((key==16)&&(inputlen!=0))//ok键按下
{
low=0;
setvflag=1;//到此上下限电压均设置好
Show_Str(140,120,200,16,"下限设置完成",16,1);
}
}//下限设置结束
if((high==0)&&(low==0))//上下限均设置完成
{
LCD_Fill(0,0,240,119,BLACK);//清除显示
POINT_COLOR=GREEN;
Show_Str(20,30,200,16,"电压设置完成,请选择波形",16,1);
POINT_COLOR=BLUE;
setvflag=0;
high=1;
}
}//电压设置结束
if(key==11)//三角波
{
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(1);//横屏
sanjiao=1;
Show_Str(0,160,200,16,"电压上限: . V",16,1);
Show_Str(0,180,200,16,"电压下限: . V",16,1);
LCD_ShowxNum(72,160,vh/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,160,vh%1000,3,16,1); //显示电压值整数部分
LCD_ShowxNum(72,180,vl/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,180,vl%1000,3,16,1); //显示电压值整数部分*/
LCD_DrawLine(0, 121, 320, 121);//零点基准线
LCD_DrawLine(0, 0, 320, 0);//最高电压基准线
while(sanjiao)
{
for(i=(vl/100);i<(vh/100);i++)
{
num=i;
Dac1_Set_Vol(i);
//if((i/100)==0)
buff[k++]=120-num/33*120;
LCD_Fast_DrawPoint(j++,(120-num/33*120),YELLOW);
delay_ms(10);
}
for(i=(vh/100);i>(vl/100);i--)
{
Dac1_Set_Vol(i);
num=i;
LCD_Fast_DrawPoint(j++,(120-(num/33*120)),YELLOW);
buff[k++]=120-num/33*120;
delay_ms(10);
}
if(j>=320)
{
for(i=0;i<k;i++)
{
LCD_Fast_DrawPoint(i,buff[i],BLACK);
}
j=0;
k=0;
}
key=KEY_Scan(0);
switch(key)//独立按键扫描
{
case KEY1_PRES:
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(0);//竖屏
LCD_Fill(0,142,240,320,WHITE);//键盘背景显示
py_load_ui(0,160);
sanjiao=0;
j=0;
k=0;
break;
}
}//显示三角波
}//三角波结束
if(key==12)//锯齿波
{
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(1);//横屏
juchi=1;
Show_Str(0,160,200,16,"电压上限: . V",16,1);
Show_Str(0,180,200,16,"电压下限: . V",16,1);
LCD_ShowxNum(72,160,vh/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,160,vh%1000,3,16,1); //显示电压值整数部分
LCD_ShowxNum(72,180,vl/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,180,vl%1000,3,16,1); //显示电压值整数部分*/
LCD_DrawLine(0, 121, 320, 121);//零点基准线
LCD_DrawLine(0, 0, 320, 0);//最高电压基准线
while(juchi)
{
for(i=(vl/100);i<(vh/100);i++)
{
num=i;
Dac1_Set_Vol(i);
//if((i/100)==0)
buff[k++]=120-num/33*120;
LCD_Fast_DrawPoint(j++,(120-num/33*120),YELLOW);
delay_ms(10);
}
if(j>=320)
{
for(i=0;i<k;i++)
{
LCD_Fast_DrawPoint(i,buff[i],BLACK);
}
j=0;
k=0;
}
key=KEY_Scan(0);
switch(key)//独立按键扫描
{
case KEY1_PRES:
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(0);//竖屏
LCD_Fill(0,142,240,320,WHITE);//键盘背景显示
py_load_ui(0,160);
juchi=0;
j=0;
k=0;
break;
}
}//显示锯齿波
}//锯齿波结束
if(key==13)//阶梯波
{
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(1);//横屏
juchi=1;
Show_Str(0,160,200,16,"电压上限: . V",16,1);
Show_Str(0,180,200,16,"电压下限: . V",16,1);
LCD_ShowxNum(72,160,vh/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,160,vh%1000,3,16,1); //显示电压值整数部分
LCD_ShowxNum(72,180,vl/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,180,vl%1000,3,16,1); //显示电压值整数部分*/
LCD_DrawLine(0, 121, 320, 121);//零点基准线
LCD_DrawLine(0, 0, 320, 0);//最高电压基准线
while(jieti)
{
for(i=(vl/100);i<(vh/100);i+=5)
{
for(l=0;l<12;l++)
{
num=i;
Dac1_Set_Vol(i);
buff[k++]=120-num/33*120;
LCD_Fast_DrawPoint(j++,(120-num/33*120),YELLOW);
delay_ms(10);
}
}
if(j>=320)
{
for(i=0;i<k;i++)
{
LCD_Fast_DrawPoint(i,buff[i],BLACK);
}
j=0;
k=0;
}
key=KEY_Scan(0);
switch(key)//独立按键扫描
{
case KEY1_PRES:
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(0);//竖屏
LCD_Fill(0,142,240,320,WHITE);//键盘背景显示
py_load_ui(0,160);
jieti=0;
j=0;
k=0;
break;
}
}//显示阶梯波
}//阶梯波结束
if(key==14)//梯形波
{
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(1);//横屏
juchi=1;
Show_Str(0,160,200,16,"电压上限: . V",16,1);
Show_Str(0,180,200,16,"电压下限: . V",16,1);
LCD_ShowxNum(72,160,vh/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,160,vh%1000,3,16,1); //显示电压值整数部分
LCD_ShowxNum(72,180,vl/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,180,vl%1000,3,16,1); //显示电压值整数部分*/
LCD_DrawLine(0, 121, 320, 121);//零点基准线
LCD_DrawLine(0, 0, 320, 0);//最高电压基准线
while(tixing)
{
for(i=(vl/100);i<(vh/100);i++)
{
num=i;
Dac1_Set_Vol(i);
buff[k++]=120-num/33*120;
LCD_Fast_DrawPoint(j++,(120-num/33*120),YELLOW);
delay_ms(10);
}
for(l=0;l<15;l++)
{
num=vh/100;
Dac1_Set_Vol(i);
buff[k++]=120-num/33*120;
LCD_Fast_DrawPoint(j++,(120-num/33*120),YELLOW);
delay_ms(10);
}
for(i=(vh/100);i>(vl/100);i--)
{
num=i;
Dac1_Set_Vol(i);
buff[k++]=120-num/33*120;
LCD_Fast_DrawPoint(j++,(120-num/33*120),YELLOW);
delay_ms(10);
}
if(j>=320)
{
for(i=0;i<k;i++)
{
LCD_Fast_DrawPoint(i,buff[i],BLACK);
}
j=0;
k=0;
}
key=KEY_Scan(0);
switch(key)//独立按键扫描
{
case KEY1_PRES:
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(0);//竖屏
LCD_Fill(0,142,240,320,WHITE);//键盘背景显示
py_load_ui(0,160);
tixing=0;
j=0;
k=0;
break;
}
}//显示梯形波
}//梯形波结束
if(sinx==1)//正弦波
{
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(1);//横屏
Show_Str(0,200,200,16,"电压上限: . V",16,1);
Show_Str(0,220,220,16,"电压下限: . V",16,1);
LCD_ShowxNum(72,200,vh/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,200,vh%1000,3,16,1); //显示电压值整数部分
LCD_ShowxNum(72,220,vl/1000,1,16,1); //显示电压值整数部分
LCD_ShowxNum(96,220,vl%1000,3,16,1); //显示电压值整数部分*/
LCD_DrawLine(0, 198, 320, 198);//零点基准线
LCD_DrawLine(0, 0, 320, 0);//最高电压基准线
k1=vh-vl;
k1=k1/6600*199;
while(sinx)
{
for(i=0;i<320;i+=2)
{
j=k1-sin(2*3.14*i*20)*k1;
Dac1_Set_Vol(j);//DA输出
buff[i]=198-j;
LCD_Fast_DrawPoint(i,buff[i],YELLOW);
delay_ms(10);
}
for(i=0;i<320;i+=2)
{
LCD_Fast_DrawPoint(i,buff[i],BLACK);
}
j=0;
k=0;
key=KEY_Scan(0);
switch(key)//独立按键扫描
{
case KEY1_PRES:
LCD_Fill(0,0,240,320,BLACK);//清除显示
LCD_Display_Dir(0);//竖屏
LCD_Fill(0,142,240,320,WHITE);//键盘背景显示
py_load_ui(0,160);
sinx=0;
j=0;
k=0;
break;
}
}//显示正弦波
}//正弦波结束
}//本函数结束
六、作品演示
请上传您的作品的功能演示到腾讯视频,并编辑到本楼(或附上视频链接)。按要求上传视频可获得5分,具体详见活动规则。
https://v.qq.com/x/page/x05408ph29o.html
七、总结
例如您在完成该作品过程中的一些体会、碰到的技术问题或调试经验、作品的未来规划,及对我们主办方的建议和意见等。
由于时间太赶,PCB未进行打样,直接利用原子的mini开发板进行调试,此外本设计未能完成频率可调部分,仅仅做到了幅度可调,以后会完善该功能。