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)
(E)实验参考程序
/*
*功能:
STM32DAC数模转换(正弦波/矩形波/三角波)输出实验
*说明:
按SW5输出正弦波/按SW4输出矩形波/按SW3输出三角波,输出端口PA4
#include
//STM32F10xLibraryDefinitions
//STM32registerandbitDefinitions
//STM32Initialization
#include
#include"STM32_Reg.h"
#include"STM32_Init.h"
#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;
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;
*(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;
}}
#endifbreak;
default:
break;
}
//
}//endwhile
}//endmain
/*
*设置方向
**/
voidSet_IO_direction(UINT8PORT,UINT8GPIO,UINT8Value){
RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;
if(PORT==PORT_A)
{
if(GPIO<8)
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
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--);
正弦波归一化程序:
tosin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,
0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5
0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0
xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0x
ea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda
0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0x
b4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99
0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,
0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,
0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,
0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07
0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,
0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,
0x7c,0x80};
6.数据测试与测试分析
(1)输出波形频率范围测试测试数据见下表:
条件:
峰峰值为5V。
表1频率测量
预置频率/Hz
方波
正弦波
三角波
1
1.01
1.01
1.01
100
99.99
99.99
99.99
200
199.98
199.98
199.98
500
500.02
500.02
500.02
1000
1000.1
1000.0
1000.1
2000
2000.2
2000.3
2000.3
5000
5000.8
5000.8
5000.9
10,000
10005
10005
10005
20,000
20,008
20009
20009
50,000
50003
50003
50004
100,000
100005
100005
100006
200,000
200007
200007
200007
(2)输出波形的幅度测量测试数据见下表:
条件:
频率为100Hz。
表2波形幅测量
预置峰峰值/V
方波/v
正弦波/v
三角波/v
0.1
\
\
\
0.2
0.22
0.26
0.32
0.5
0.51
0.54
0.56
1
1.01
1.05
1.1
2
2.00
2.08
2.1
5
5.01
5.02
5.08
10
10.0
10.0
10.1
结果分析总结:
1从表中可以看出频率可以实现1HZ步进可调,而且精度比较高。
0.1V
2从表中我们可以看出,幅度可调,步进为0.1V。
但输出峰峰值为时效果不佳,无法测量。
当峰峰值大于0.5V时精度比较高。