正弦信号参数可调
- 格式:wps
- 大小:218.50 KB
- 文档页数:5
实验目的:以 STM32 为处理器,利用其片上外设 DAC、DMA、TIMER 产生正弦信
号,通过四个按键来实现幅度、频率、相位可调的正弦信号。同时正弦信号的参 数信息可在液晶显示屏上实时显示。
实验需求:实现精度后可作为信号源
实验思路:采用模块化设计,先单独对 DAC+DMA 模块进行设计,在对定时器模
flag=flag-1; } fg[0]=flag%10 + '0'; fg[1] ='\0' ; ili9320_PutStr_16x24(200,20, fg, len8,charColor, bkColor); } if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)==0) //flag 自加 选择功能 { Delay_ARMJISHU(8000); while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)==0) ; Delay_ARMJISHU(500); if (flag<3) {
if(flag==1) {
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==0) //调幅度系数 减小 {
Delay_ARMJISHU(8000); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)==0) {
Delay_ARMJISHU(500);
在这里设置 flaga 的标志位,只要是为了实现 64 个数据在对应的按键下进
行相应的参数的更新,如果一开始就一直放在大循环里面去,就会出现显示的波
形波动性大,而且在个别的点出现 0 的值,究其原因可能是:在更新数据的时刻,
原始的数据也在进行 DMA 的数据传递 DAC 转换。
if(flaga==1) {
按键功能:四个独立的按键如何实现三个参数的自加、自减的功能。理论上是
六个独立的按键就 OK。在这种情况下,可以是两个独立的按键作为功能选择键,
在这两个按键函数里设置标志位 flag,它的值可以是 1、2、3、4、5、6、.........
然后利用 if(flag==值)就可以实现 N 个参数的功能加减。
对于幅度误差的处理可以利用分段函数进行运算。 if(apm<=1365 && apm>1200) else if(apm<=1200 && apm>1000) else if(apm<=1000 && apm>800) else if(apm<=800 && apm>600) else if(apm<=600 && apm>100)
程序放在 while(1)里面,按键是每次加减的为‘1’。
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0) //flag 自减 选择功能 {
Delay_ARMJISHU(8000); while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0) ; Delay_ARMJISHU(500); if(flag>1) {
else
在液晶上显示的是字符串,所以这里要把整数转换成字符串: apt=(uint32_t)(24.24*apm-3091); am[0] = (apt/10000)+'0'; am[1] = '.'; am[2] = ((apt/1000)%10)+'0'; am[3] = ((apt/100)%10)+'0'; am[4] = '\0';
if(apm>1) {
apm=apm-1; } flaga=1; } } if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3)==0) //调幅度系数 增大 { Delay_ARMJISHU(8000); if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3)==0) { Delay_ARMJISHU(500); if (apm<1365) { apm=apm+1; } flaga=1; } }
flag=flag+1; } fg[0]=flag%10 + '0'; fg[1] ='\0' ; ili9320_PutStr_16x24(200,20, fg, len8,charColor, bkColor); }
设置好之后就是单独对各个参数进行功能化设计。这里的按键实现只要按
下,对应的数值就一直在进行运算处理,不是每次加减为‘1’。
flaga=0; for(i=0;i<65;i++) {
sina[i]=(sin(i*2*pi/64)*1.5+1.5)*apm; sinb[i]=(sin(i*2*pi/64+pha*pi/180)*1.5+1.5)*apm; sina[i]=(sina[i])+(sinb[i]<<16); } }
频率程序和相位程序的设计和幅度程序设计是一样的! 实验结果:
for(i=0;i<64;i++) {
sina[i]=(sin(i*2*pi/64)*1.5+1.5)*apm; sinb[i]=(sin(i*2*pi/64+pha*pi/180)*1.5+1.5)*apm; sina[i]=(sina[i])+(sinb[i]<<16); } 要改变正弦信号的频率,就要让定时器作为 DAC 转换的触发源,去触发 DAC+DMA 转换,这样就可以通过改变定时器的周期就可以改变正弦信号的频率 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = fre; TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
块进行设计,而后对液晶显示屏模块进行设计。通过对三个小实验的操作成功后, 在综合在一起。在进行试验调试的时候可利用 USART 串口打印数据。
参数调系数设计思路:利用 math.h 里的 sin(2*π*i + θ)进行 32 个点或者
64 个点进行采样,其中 apm 是调幅系数,pha 是调相系数,调频系数 fre 在定时 器里设置。