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

立创商城工程部
【官方工作人员】
113
主题
1325
回复
发表于2017-06-23 21:42:30   |  只看该作者
2#

欢迎参与!   

您已经报名成功!

您现在就可以开始进行设计工作了,后期相关内容请在一楼编辑进行完善。

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

立创君
【官方工作人员】
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。
仙人掌
3
主题
45
回复
发表于2017-06-29 22:54:06   |  只看该作者
4#
不错的想法,做稳定之后可考虑产品化
CatCaptain
20
主题
76
回复
发表于2017-07-03 13:59:46   |  只看该作者
5#
请注意stm32的DAC系列的最高更新频率是1MHz,而且IO的翻转速度也不高,所以能够 输出的波形频率比较有限。
wangshujun
9
主题
35
回复
发表于2017-07-07 17:32:09   |  只看该作者
6#
CatCaptain 发表于2017-07-03 13:59:46  5# 请注意stm32的DAC系列的最高更新频率是1MHz,而且IO的翻转速度也不高,所以能够输出的波形频率比较有限。
前一阵测试了407的dac,数据更新率可以达到10.5兆,正弦波输出大概在700k左右的时候衰减还不算很大,1兆的时候是正弦,但是衰减的很严重了,内置的buff(运放)在频率稍高一点就会带来很大的波形失真,需要关掉
喜马拉雅山
0
主题
9
回复
发表于2017-08-25 12:52:37   |  只看该作者
7#
比较实在的作品内容,学到了很多,楼主之后还会继续更新吗
立创小程
【官方工作人员】
7
主题
204
回复
发表于2017-08-26 13:02:32   |  只看该作者
8#
恭喜楼主获得了第二届立创商城电子制作节入围奖,虽然距离30强还有些小差距,30强&入围奖名单:http://club.szlcsc.com/article/details_8910_1.html
但到明年的第三届电子制作节,带上您更成熟的作品参赛时,也许就能一举夺冠了呢,现在,有众多优秀作品让你参考,投票:http://club.szlcsc.com/article/details_8913_1.html
不断前行
小白求学ing
0
主题
1
回复
发表于2021-11-25 21:14:21   |  只看该作者
9#
楼主你好,本人在校大二学生,对你的作品很感兴趣,可以发一份工程研究一下吗:3011944140@qq.com

主题

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

禁言/删除

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

举报

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

顶部