4)5次谐波数据的生成函数
W(t)=a*sin(t)+b*sin(2t+m)+c*sin(3t+n)+d*sin(4t+p)+e*sin(5t+q)
此函数要求幅值和相位参数:
a.b.c.d.e.m.n.p.q
5)正弦波、方波、三角波线性组合波数据生成函数
D(t)=a*S(t)+b*F(t+m)+c*T(t+n)
(5)实验参考程序
/*----------------------------------------------------------------------------
*功能:
STM32DAC数模转换(正弦波/矩形波/三角波)输出实验
*说明:
按SW5输出正弦波/按SW4输出矩形波/按SW3输出三角波,输出端口PA4
*----------------------------------------------------------------------------*/
#include
#include//STM32F10xLibraryDefinitions
#include"STM32_Reg.h"//STM32registerandbitDefinitions
#include"STM32_Init.h"//STM32Initialization
#include"common.h"
#include"sine_wave_1024.h"
//输出端口:
PA4
#defineSINE_WAVE1//sine正弦波
#defineRECT_WAVE2//rectangular矩形波
#defineHACKLE_WAVE3//hackle三角波
UINT8flag=0;
UINT8func=SINE_WAVE;
/*----------------------------------------------------------------------------
MAINfunction
*----------------------------------------------------------------------------*/
intmain(void)
{
UINT16i=0;
UINT32*pDAC_BASE=(UINT32*)DAC_BASE;
stm32_Init();//STM32setup
LED_Init();
//打开DAC时钟使能
RCC->APB1ENR|=(UINT32)(1<<29);
//设置DAC控制参数*(pDAC_BASE+0x00)=(0x01<<0)|(0x00<<2)|(0x04<<3)|(0x03<<6)|(0x0b<<8);
*(pDAC_BASE+0x04)=0x01
printf("---------------Programstart---------------\r\n");
while(TRUE)//Loopforever
{
if(!
Get_SW5())
{
func=SINE_WAVE;
}
elseif(!
Get_SW4())
{
func=RECT_WAVE;
}
elseif(!
Get_SW3())
{
func=HACKLE_WAVE;
}
switch(func)
{
caseSINE_WAVE:
//-------------------------------------------------------------
#ifdefSINE_WAVE
if(i<1024)i+=2;
elsei=0;
*(pDAC_BASE+0x08)=Sine_WAVE[i]<<4;
#endif
//-------------------------------------------------------------
break;
caseRECT_WAVE:
#ifdefRECT_WAVE
for(i=0;i<2000;i++)
*(pDAC_BASE+0x08)=0x0fff;
for(i=0;i<2000;i++)
*(pDAC_BASE+0x08)=0;
#endif
//-------------------------------------------------------------
break;
caseHACKLE_WAVE:
#ifdefHACKLE_WAVE
if(flag)
{
flag=0;
while(TRUE)
{
if(i<4096)i+=1;
elsebreak;
*(pDAC_BASE+0x08)=i;
}
}
else
{
flag=1;
while(TRUE)
{
if(i>0)i-=1;
elsebreak;
*(pDAC_BASE+0x08)=i;
}
}
#endif
break;
default:
break;
}
//-------------------------------------------------------------
}//endwhile
}//endmain
/*----------------------------------------------------------------------------
*设置方向
*----------------------------------------------------------------------------*/
voidSet_IO_direction(UINT8PORT,UINT8GPIO,UINT8Value)
{
RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
if(PORT==PORT_A)
{
if(GPIO<8)
{
GPIOA->CRL&=~(0x0f<<(GPIO*4));//Clrusedbit
GPIOA->CRL|=(Value<<(GPIO*4));//Setusedbit
}
else
{
GPIOA->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit
GPIOA->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit
}
}
if(PORT==PORT_B)
{
if(GPIO<8)
{
GPIOB->CRL&=~(0x0f<<(GPIO*4));//Clrusedbit
GPIOB->CRL|=(Value<<(GPIO*4));//Setusedbit
}
else
{
GPIOB->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit
GPIOB->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit
}
}
if(PORT==PORT_C)
{
if(GPIO<8)
{
GPIOC->CRL&=~(0x0f<<(GPIO*4));//Clrusedbit
GPIOC->CRL|=(Value<<(GPIO*4));//Setusedbit
}
else
{
GPIOC->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit
GPIOC->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit
}
}
if(PORT==PORT_D)
{
if(GPIO<8)
{
GPIOD->CRL&=~(0x0f<<(GPIO*4));//Clrusedbit
GPIOD->CRL|=(Value<<(GPIO*4));//Setusedbit
}
else
{
GPIOD->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit
GPIOD->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit
}
}
if(PORT==PORT_E)
{
if(GPIO<8)
{
GPIOE->CRL&=~(0x0f<<(GPIO*4));//Clrusedbit
GPIOE->CRL|=(Value<<(GPIO*4));//Setusedbit
}
else
{
GPIOE->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit
GPIOE->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit
}
}
}
/*----------------------------------------------------------------------------
SendChar
WritecharactertoSerialPort.
*----------------------------------------------------------------------------*/
intSendChar(intch){
while(!
(USART2->SR&USART_FLAG_TXE));
USART2->DR=(ch&0x1FF);
return(ch);
}
/*----------------------------------------------------------------------------
GetKey
ReadcharactertoSerialPort.
*----------------------------------------------------------------------------*/
intGetKey(void){
while(!
(USART2->SR&USART_FLAG_RXNE));
return((int)(USART2->DR&0x1FF));
}
voidLED_Init(void)
{
Set_IO_direction(PORT_E,LED1,OUTPUT);
Set_IO_direction(PORT_E,LED2,OUTPUT);
Set_IO_direction(PORT_E,LED3,OUTPUT);
Set_IO_direction(PORT_E,LED4,OUTPUT);
Set_IO_direction(PORT_B,SW2,INPUT);
Set_IO_direction(PORT_B,SW3,INPUT);
Set_IO_direction(PORT_E,SW4,INPUT);
Set_IO_direction(PORT_E,SW5,INPUT);
Turn_OFF_LED1();
Turn_OFF_LED2();
Turn_OFF_LED3();
Turn_OFF_LED4();
}
/*----------------------------------------------------------------------------
insertadelaytime.
*----------------------------------------------------------------------------*/
voiddelay(unsignedintnCount)
{
for(;nCount!
=0;nCount--);
}
心得体会
通过这次三级项目,我们小组学会了频率发生器的设计方法,对频率发生器的工作原理和使用方法也有了更深刻的理解。
在对理论的运用中,提高了我们的素质,在设计的过程中,同学们积极查阅相关资料,在理解的基础上运用到设计中,在交流中大家提出意见,对团队的进步与成长给了很大的帮助。
在此,向给我们提供帮助的同学们以及郝老师,表示真诚的谢意,感谢你们对我们小组的细心指导。
小组分工
参考文献
《智能仪器设计》丁国清,陈欣
《智能仪器》付华
《基于STM32的信号发生器设计》XX文库