STM 32 DMA+DAC+TIMERで正弦波を出力

4602 ワード

前に簡単に述べましたが、私個人の菜鳥の理解と認識に基づいて、前の知識を整理して振り返ります.
DMA:私の理解は通路か橋です.静的メモリから静的メモリ、または静的メモリ間の通信チャネルを外付けします.このチャネルを確立するメリットは、CPUを捨ててCPUのリソースを消費せずに、このメモリの内容を直接使用することで、速度も速くなります.
DAC:STM 32 F 103には2つのDACがあり、同時に使用できます.DACの役割はデジタル量をアナログ量(電圧)に変換することであり,ここではあまり説明しない.
TIMER:タイマー.説明をしない.
では、DMA+DAC+TIMERを使用して正弦波を生成する原理やプロセスについて、私はこのような簡単な理解を持っています.
まず正弦波を生成できるデータテーブルを静的メモリに保存し、DACとそのメモリの間にDMAを使用してチャネルを確立します.以上の手順を経て、DACモジュールはDAMチャネルを通じて静的メモリから正弦波を生成できるデータを取得し、データを取得し、デジタルモードで変換することができます.ピンから出力すると正弦波が得られます.もちろん,この速度は非常に速く,一定の遅延がなければ,得られた推定は変化の速いシミュレーション量である.だからこの時はタイマーTIMERを使う必要があります.DACは、初期化時にタイマトリガを使用するように設定することができ、これは、タイマがいっぱいになると、DAC動作をトリガすることを意味する.これにより,タイマのタイミング時間を変えることで正弦波の周期を変えることができる.
以上は私の1つの简単な理解で、多くの厳格で正しくない地方があるべきで、结局1つの初心者の菜鸟で、以上の见解も自分で勉强するのに便利で、私も绝えず勉强することによって栄养を补充します.解析の例を次に示します.
1、波形テーブルの初期化及び出力のピン
/********      ***********/
void SineWave_Data( u16 cycle ,u16 *D)
{
	u16 i;
	for( i=0;iDHR12R1)   //DAC  1    
#define DAC_DHR12R2    (u32)&(DAC->DHR12R2)   //DAC  2    


/****************     ******************/
void SineWave_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //   
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //      
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//    	
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5 ; //    
	GPIO_SetBits(GPIOA,GPIO_Pin_5)	;	//    
	GPIO_Init(GPIOA, &GPIO_InitStructure);		//   
}

2、DACの初期化
/******************DAC   ¯*************************/
void SineWave_DAC_Config( void)
{
    DAC_InitTypeDef            DAC_InitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);// DAC  
	
  /**************DAC     *******************/
    DAC_StructInit(&DAC_InitStructure);		
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//     
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //       
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;//DAC      2  
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);//   
    DAC_Cmd(DAC_Channel_1, ENABLE);	   //  DAC   1
    DAC_DMACmd(DAC_Channel_1, ENABLE); //  DAC  1 DMA	
}

3、タイマーの配置
/*********      ************/
void SineWave_TIM_Config(u32 Wave1_Fre)
{
    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//   
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Prescaler = 0x0;     //    
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// TIM_TimeBaseStructure.TIM_Period = Wave1_Fre;// TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);// TIME }

4、DMA配置
/*********DMA  ***********/
void SineWave_DMA_Config(void)
{					
	DMA_InitTypeDef            DMA_InitStructure;
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);//  DMA2  
	
	DMA_StructInit( &DMA_InitStructure);		//DMA      
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//       
	DMA_InitStructure.DMA_BufferSize = 256;//     
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//       
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;	//      
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//     
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//     
	DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;/      
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//         
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//      

     DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1;//外付けアドレスがDACチャネル1のアドレスDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SineWave_Value;//波形データテーブルメモリアドレス
     DMA_Init(DMA2_Channel3, &DMA_InitStructure);//DMA_の初期化Cmd(DMA2_Channel3, ENABLE);//イネーブルDMAチャネル3
}
5、正弦波初期化
 
void SineWave_Init(u16 Wave1_Fre)
{
  u16 f1=(u16)(72000000/sizeof(SineWave_Value)*2/Wave1_Fre);//    
   SineWave_Data( 256 ,SineWave_Value);		//           
  SineWave_GPIO_Config();			  //   io
  SineWave_TIM_Config(f1);			  //      
  SineWave_DAC_Config();			  //  DAC
  SineWave_DMA_Config();			  //  DMA
  TIM_Cmd(TIM2, ENABLE);			 //     
}

以上の簡単な構成により、32板にsin波形を出力させることができる.
転載先:https://www.cnblogs.com/zhoubatuo/p/6123217.html