历史上的今天
今天是:2024年10月15日(星期二)
2019年10月15日 | STM32F103ZET6任意频率正弦波+三角波工程源码
2019-10-15 来源:eefocus
STM32F103输出正弦波源程序,大家可以参考下
单片机源程序如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "key.h"
#include "led.h"
#include "STM32_WaveOutput.h"
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600); //串口初始化为9600
delay_init(72); //延时初始化
LED_Init();
KEY_Init(); //初始化与按键连接的硬件接口
SineWave_Init( SawToothWave ,10 ,ENABLE ,SinWave ,10 ,ENABLE);//PA4输出为 10Hz的三角波;PA5输出为10Hz的正弦波
printf("The Program is running!!!n");
while(1)
{/********KEY3为增加频率,KEY1为减少频率;(变化量为100)***测试不好用*****/
// static u16 f=1000;
// if( KEY_Scan(0)==4)
// {
// f +=100;
// if(f>15000) f=15000;
// Set_WaveFre( Wave_Channel_1 ,f);
// }
// else if( KEY_Scan(0)==2)
// {
// f -=100;
// if(f<=20) f=5;
// Set_WaveFre( Wave_Channel_1 ,f);
// }
LED0=!LED0;
delay_ms(500);
}
}
复制代码
#include "STM32_WaveOutput.h"
#include "delay.h"
/********生成正弦波形输出表***********/
void SineWave_Data( u16 cycle ,u16 *D)
{
u16 i;
for( i=0;i D[i]=(u16)((Um*sin(( 1.0*i/(cycle-1))*2*PI)+Um)*4095/3.3); } } /********生成锯齿波形输出表***********/ void SawTooth_Data( u16 cycle ,u16 *D) { u16 i; for( i=0;i D[i]= (u16)(1.0*i/255*4095); } } /******************正弦波形表***********************/ #ifdef Sine_WaveOutput_Enable u16 SineWave_Value[256]; //已用函数代替 #endif /******************锯齿波形表***********************/ #ifdef SawTooth_WaveOutput_Enable u16 SawToothWave_Value[256]; //已用函数代替 #endif /******DAC寄存器地址声明*******/ #define DAC_DHR12R1 (u32)&(DAC->DHR12R1) //DAC通道1输出寄存器地址 #define DAC_DHR12R2 (u32)&(DAC->DHR12R2) //DAC通道2输出寄存器地址 /****************引脚初始化******************/ void SineWave_GPIO_Config(u8 NewState1 ,u8 NewState2) { RCC->APB2ENR|=1<<2; //使能PORTA时钟 if( NewState1!=DISABLE) { GPIOA->CRL&=0xFFF0FFFF; GPIOA->CRL&=0x00030000; GPIOA->ODR|=(1<<4); } if( NewState2!=DISABLE) { GPIOA->CRL&=0xFF0FFFFF; GPIOA->CRL&=0x00300000; GPIOA->ODR|=(1<<5); } } /******************DAC初始化*************************/ void SineWave_DAC_Config(u8 NewState1 ,u8 NewState2) { RCC->APB2ENR|=1<<2; //使能PORTA时钟 RCC->APB1ENR|=1<<29; //使能DAC时钟 GPIOA->CRL&=0XFFF0FFFF; GPIOA->CRL|=0X00000000;//PA4 模拟输入 if( NewState1!=DISABLE) { DAC->CR|=1<<0; //使能DAC通道1 DAC->CR|=1<<1; //DAC1输出缓存不使能 BOFF1=1 DAC->CR|=1<<2; //使用触发功能 TEN1=1 DAC->CR|=0<<3; //3、4、5=100时为TIM2 TRGO事件触发 DAC->CR|=0<<4; // DAC->CR|=1<<5; // DAC->CR|=0<<6; //不使用波形发生 DAC->CR|=0<<8; //屏蔽、幅值设置 DAC->CR|=1<<12; //DAC1 DMA使能 } if( NewState2!=DISABLE) { DAC->CR|=1<<16; //使能DAC通道2 DAC->CR|=1<<17; //DAC2输出缓存不使能 BOFF1=1 DAC->CR|=1<<18; //使用触发功能 TEN2=1 DAC->CR|=0<<19; //3、4、5=100时为TIM2 TRGO事件触发 DAC->CR|=0<<20; // DAC->CR|=0<<21; // DAC->CR|=0<<22; //不使用波形发生 DAC->CR|=0<<24; //屏蔽、幅值设置 DAC->CR|=1<<28; //DAC1 DMA使能 DAC->DHR12R1=0;//使能通道1 DAC->DHR12R2=0;//使能通道2 } } /*********定时器配置************/ void SineWave_TIM_Config( u32 Wave1_Fre ,u8 NewState1 ,u32 Wave2_Fre ,u8 NewState2) { if( NewState1!=DISABLE)RCC->APB1ENR|=1<<0; //TIM2时钟使能 if( NewState2!=DISABLE)RCC->APB1ENR|=1<<4; //TIM6时钟使能 TIM2->PSC=0x0; //预分频器不分频 TIM2->CR1|=0<<4;//向上计数模式 TIM6->PSC=0x0; TIM6->CR1|=0<<4;//向上计数模式 if( NewState1!=DISABLE) { TIM2->ARR=Wave1_Fre; TIM6->CR1|=0x01; //使能定时器6 TIM2->CR2 &= (u16)~((u16)0x0070);//设置TIM2输出触发为更新模式
史海拾趣
|
小弟目前在做一个5416dsk板的工作,希望把板子上算出来的一些float值通过RTDX传送到在主机上用matlab设计的图形用户界面里,但是奇怪的是110个点可以传送成功,可以在图形用户界面上看的到,但是如果传256个点就不行.希望各位前辈不吝赐教哈,拜谢了.… 查看全部问答> |




