首页 > 编程知识 正文

lm358正弦波发生电路图,锯齿波如何变成正弦波

时间:2023-05-04 06:55:09 阅读:59284 作者:4699

main.c

# include ' sys.h ' # include ' usart.h ' # include ' delay.h ' # include ' key.h ' # include ' led.h ' //串行端口为9600delay_init(72 ); //延迟初始化LED_Init (; KEY_Init (; 初始化连接到//密钥的硬件接口sinewave_init(sawtoothwave,100,ENABLE,SinWave,100,ENABLE ); //PA4输出为10Hz的三角波; PA5输出为10Hz的正弦波printf('theprogramisrunning! n '; wile(1) (/******key3为增加频率,KEY1为减少频率; * /静态u16 f=1000; if(key_scan(0)==4) ) { f =10000; if(f15000 ) f=15000; set_wavefre(wave_channel_1,f ); }elseif(key_scan(0)==2) { f -=10000; if(f=20 ) f=5; set_wavefre(wave_channel_1,f ); }LED0=! LED0; elay_ms(500; }波形生成

# include ' STM 32 _ wave output.h ' # include ' delay.h '/* * * * * *正弦波形输出表* * * * * * * * */voidsinewave _ * 周期; I ) d[I]=(U16 ) (Um*sin ) ) 1.0*I/(周期-1) ) *2* pi (um ) ) *4095/3.3 ); }/******锯齿波形输出表* * * * * * * */void sawtooth _ data (u 16 cycle,u16 *D ) ) {u16 i; for(I=0; icycle/2; I ) d[I]=(u16 ) ) 1.0*i/255*4095 ); }for(I=cycle/2; 周期; I ) d[I]=(U16 ) ) 1.0 * (循环- I )/255*4095 ); }}/*****方波输出表* * * * * * * * * */voidfangtooth _ data (u16 cycle,u16 *D ) ) {u16 i; for(I=0; icycle/2; I ) d[I]=(u16 ) ) 1.0 *周期); (for ) I=0; icycle/2; I ) d[I]=(u16 ) 0; }/***************正弦波形表* * * * * * * * * * * * * * * * * * */# ifdef sine _ wave output _ en ave///endd 用函数代替ifdef sawtooth _ */# endif/* * * * * DAC寄存器地址声明*******/#defineDAC_dhr12r1(u32 ) ) DAC-dhr **引脚初始化* * * * * * * * * * * */voidsinewave _ gpio _ config (启用u8 NewState21、u8 NewState21、u8Newstate PORTA时钟IF=disable(gpioa-CRL=0xfff0ffff; GPIOA-CRL=0x00030000; GPIOA-ODR|=(14; (if ) Newstate2!=disable(gpioa-CRL=0xff0fffff; GPIOA-CRL=0x00300000; GPIOA-ODR|=(15; }/**************DAC初始化* * * * * * * * * * * * * * * * * * * * * * */voidsinewave _ DAC _ conform portor //DAC时钟gpioa-CRL=0启用xfff 0f fff gpioa-CRL|=0x 0000000; //

PA4 模拟输入 if( NewState1!=DISABLE){DAC->CR|=1<<0;//使能DAC通道1DAC->CR|=1<<1;//DAC1输出缓存不使能 BOFF1=1DAC->CR|=1<<2;//使用触发功能 TEN1=1DAC->CR|=0<<3;//3、4、5=100时为jjdds2 TRGO事件触发DAC->CR|=0<<4;//DAC->CR|=1<<5;//DAC->CR|=0<<6;//不使用波形发生DAC->CR|=0<<8;//屏蔽、幅值设置DAC->CR|=0<<11;DAC->CR|=1<<12;//DAC1 DMA使能 }if( NewState2!=DISABLE){DAC->CR|=1<<16;//使能DAC通道2DAC->CR|=1<<17;//DAC2输出缓存不使能 BOFF1=1DAC->CR|=1<<18;//使用触发功能 TEN2=1DAC->CR|=0<<19;//3、4、5=100时为jjdds2 TRGO事件触发DAC->CR|=0<<20;//DAC->CR|=0<<21;//DAC->CR|=0<<22;//不使用波形发生DAC->CR|=0<<24;//屏蔽、幅值设置DAC->CR|=0<<27;DAC->CR|=1<<28;//DAC1 DMA使能 DAC->DHR12R1=0;//使能通道1DAC->DHR12R2=0;//使能通道2}}/*********定时器配置************/void SineWave_jjdds_Config( u32 Wave1_Fre ,u8 NewState1 ,u32 Wave2_Fre ,u8 NewState2){if( NewState1!=DISABLE)RCC->APB1ENR|=1<<0;//jjdds2时钟使能if( NewState2!=DISABLE)RCC->APB1ENR|=1<<4;//jjdds6时钟使能 jjdds2->PSC=0x0;//预分频器不分频jjdds2->CR1|=0<<4;//向上计数模式jjdds6->PSC=0x0;jjdds6->CR1|=0<<4;//向上计数模式 if( NewState1!=DISABLE){jjdds2->ARR=Wave1_Fre;jjdds6->CR1|=0x01; //使能定时器6jjdds2->CR2 &= (u16)~((u16)0x0070);//设置jjdds2输出触发为更新模式jjdds2->CR2 |=0x0020;//设置jjdds2输出触发为更新模式}if( NewState2!=DISABLE){jjdds6->ARR = Wave2_Fre; //设置输出频率 jjdds2->CR1|=0x01; //使能定时器2jjdds6->CR2 &= (u16)~((u16)0x0070);//设置jjdds2输出触发为更新模式jjdds6->CR2 |=0x0020;//设置jjdds2输出触发为更新模式}}/*********DMA配置***********/void SineWave_DMA_Config( u16 *Wave1_Mem ,u8 NewState1 ,u16 *Wave2_Mem ,u8 NewState2){RCC->AHBENR|=1<<1;//开启DMA2时钟delay_ms(5);//等待DMA时钟稳定if( NewState1!=DISABLE){DMA2_Channel3->CPAR=DAC_DHR12R1; //DMA1 外设地址 DMA2_Channel3->CMAR=(u32)Wave1_Mem; //DMA1,存储器地址DMA2_Channel3->CNDTR=256; //DMA2,传输数据量DMA2_Channel3->CCR=0X00000000;//复位DMA2_Channel3->CCR|=1<<4; //从存储器读DMA2_Channel3->CCR|=0<<6; //外设地址非增量模式DMA2_Channel3->CCR|=1<<7; //存储器增量模式DMA2_Channel3->CCR|=1<<8; //外设数据宽度为16位DMA2_Channel3->CCR|=1<<10; //存储器数据宽度16位DMA2_Channel3->CCR|=1<<12; //最高优先级DMA2_Channel3->CCR|=1<<13; //最高优先级DMA2_Channel3->CCR|=0<<14; //非存储器到存储器模式DMA2_Channel3->CCR|=1<<5; //循环发送模式DMA2_Channel3->CCR|=1<<0; //开启DMA传输}if( NewState2!=DISABLE){DMA2_Channel4->CPAR=DAC_DHR12R2; //DMA1 外设地址 DMA2_Channel4->CMAR=(u32)Wave2_Mem; //DMA1,存储器地址DMA2_Channel4->CNDTR=256; //DMA2,传输数据量DMA2_Channel4->CCR=0X00000000;//复位DMA2_Channel4->CCR|=1<<4; //从存储器读DMA2_Channel4->CCR|=0<<6; //外设地址非增量模式DMA2_Channel4->CCR|=1<<7; //存储器增量模式DMA2_Channel4->CCR|=1<<8; //外设数据宽度为16位DMA2_Channel4->CCR|=1<<10; //存储器数据宽度16位DMA2_Channel4->CCR|=1<<12; //最高优先级DMA2_Channel4->CCR|=1<<13; //最高优先级DMA2_Channel4->CCR|=0<<14; //非存储器到存储器模式DMA2_Channel4->CCR|=1<<5; //循环发送模式DMA2_Channel4->CCR|=1<<0; //开启DMA传输} }void Myjjdds_SetAutoreload(jjdds_TypeDef* jjddsx, u16 Autoreload){ /* Check the parameters */ assert_param(IS_jjdds_ALL_PERIPH(jjddsx)); /* Set the Autoreload Register value */ jjddsx->ARR = Autoreload;}/***********正弦波初始化***************///u8 Wave1 波形1//u16 Wave1_Fre 波形1频率(Hz)//u8 NewState1 波形1状态(忽略)//u8 Wave2 波形2//u16 Wave2_Fre 波形2频率(Hz)//u8 NewState2 波形2状态(忽略)//调用exp: SineWave_Init( SawToothWave ,10 ,ENABLE ,SinWave ,10 ,ENABLE);//三角波,10Hz,正弦波,10Hzvoid SineWave_Init(u8 Wave1,u16 Wave1_Fre,u8 NewState1,u8 Wave2,u16 Wave2_Fre,u8 NewState2){ u16 *add1,*add2;u16 f1=(u16)(72000000/sizeof(SineWave_Value)*2/Wave1_Fre);u16 f2=(u16)(72000000/sizeof(SineWave_Value)*2/Wave2_Fre); SineWave_Data( N ,SineWave_Value);//生成波形表1SawTooth_Data( N ,SawToothWave_Value);//生成波形表2if( NewState1!=DISABLE){if( Wave1==0x00) add1=SineWave_Value; else add1=SawToothWave_Value;} if( NewState2!=DISABLE){ if( Wave2==0x00) add2=SineWave_Value; else add2=SawToothWave_Value;}SineWave_GPIO_Config( ENABLE ,ENABLE); //初始化引脚 SineWave_jjdds_Config( f1 , NewState1 ,f2 ,NewState2); //初始化定时器 SineWave_DAC_Config(NewState1 ,NewState2); //初始化DACSineWave_DMA_Config( add1 ,NewState1 ,add2 ,NewState2); //初始化DMA if( NewState1!=DISABLE)jjdds2->CR1|=0x01; //使能定时器2; //使能jjdds2,开始产生波形 if( NewState2!=DISABLE) jjdds6->CR1|=0x01; //使能定时器2; //使能jjdds6,开始产生波形 }void Set_WaveFre( u8 Wave_Channel ,u16 fre){jjdds_TypeDef* jjddsX;u16 reload;if( Wave_Channel==0x00)jjddsX = jjdds2;else if(Wave_Channel==0x01)jjddsX = jjdds6;reload=(u16)(72000000/512/fre);Myjjdds_SetAutoreload( jjddsX ,reload);}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。