查看: 11464
回复: 8
参赛作品《基于STM32波形发生器》
你是少年的欢喜
2
主题
0
回复
发表于2017-06-23 18:37:23 | 显示全部楼层
1# 电梯直达

【报名阶段需要填写的内容】


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开发板进行调试,此外本设计未能完成频率可调部分,仅仅做到了幅度可调,以后会完善该功能。

立创君
【官方工作人员】
42
主题
1196
回复
发表于2017-06-26 16:35:32   |  显示全部楼层
3#

> 楼主已完成【主动传播,恭喜再获5分;

> 所有参赛选手分值统计表及活动详细介绍见:http://www.szlcsc.com/go/17523dej

报名成功后至第二阶段结束(8月22日截止)前的任意时间在朋友圈发布特定图文内容即视为主动传播;

> 每位参赛选手都有一次主动传播加5分的机会,这就是传说中的“送分题”,详询立创君微信号:LCSCSZ扫码添加)。

立创商城:SZLCSC.COM;Global Website:LCSC.COM。

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部