STM 32 DMAを使用して正弦波、三角波、方波を発生
24731 ワード
一:stm 32を使用して波形を生成するには、もちろんDACを使用する必要があります.これは欠かせません.stm 32には三角波ジェネレータがありますが、ここでは主にdmaを使用しています.このように、どんな波形を生成しても、対応する関数のリストを構築すればいいです.
二:関数リストの実装
主にサンプリング法で、1つの波形図の上で複数の点を選択して、それから相応の数値を保存して、呼び出し(DMA循環呼び出し)を待って、それからDACを通じて数値を変換して、最後に波形を近似して得て、この方法は実は数学の中の描点法です;正弦波:
方波:
三角波:
生成された数を対応する配列に格納すればよいので、DMA呼び出しを待つ.
三:キー制御周波数増減://キー初期化
//主関数キー制御部
四:DAC,DMA,TIME初期化;//ここでは正弦波のみを挙げる
五:以上をまとめると正弦波が生成されますが、まだ少し足りないものが彼らを組織して、みんなで自分で追加すればいいです.私の才学が浅くて、構想をよく整理することができなくて、コードを提供してみんなの参考にするしかありません;もしソースが必要なものがあれば、私のqqを加えればいいです.
二:関数リストの実装
主にサンプリング法で、1つの波形図の上で複数の点を選択して、それから相応の数値を保存して、呼び出し(DMA循環呼び出し)を待って、それからDACを通じて数値を変換して、最後に波形を近似して得て、この方法は実は数学の中の描点法です;正弦波:
u16 D_sin[256];
void SineWave_Data()
{
u16 i;
for( i=0;i<=255;i++)
{
D_sin[i]=(u16)(4095*(sin(i*2*3.1415926/255)+1)/2);
}
}
方波:
u16 D_fang[N];
void Fang_Data()
{
u16 i;
for(i=0;i<N/2;i++)
{
D_fang[i]= (u16)(0);
}
for( i=N/2;i<N;i++)
{
D_fang[i]=(u16)(4095);
}
}
三角波:
u16 D_saw[N];
void Saw_Data()
{
u16 i;
for( i=0;i<N/2;i++)
{
D_saw[i]= (u16)(4095*2*i/N);
}
for( i=N/2;i<N;i++)
{
D_saw[i]= (u16)(2*4095*(N-i)/N);
}
}
生成された数を対応する配列に格納すればよいので、DMA呼び出しを待つ.
三:キー制御周波数増減://キー初期化
void KEY_init()
{
RCC->APB2ENR|=1<<2; // PORTA
RCC->APB2ENR|=1<<4; // PORTC
//JTAG_Set(SWD_ENABLE); // JTAG, SWD
GPIOA->CRL&=0XFFFFFFF0; //PA0
GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0FFFFFFF; //PA15
GPIOA->CRH|=0X80000000;
GPIOA->ODR|=1<<15; //PA15 ,PA0
GPIOC->CRL&=0XFF0FFFFF; //PC5
GPIOC->CRL|=0X00800000;
GPIOC->ODR|=1<<5; //PC5
}
//主関数キー制御部
//
if(KEY_0 == 0 && mode==0 )
{
delay_ms(10);
fang_Hz +=1;
saw_Hz +=1;
mode=1;
}
else if(KEY_1==0 && mode==0)
{
delay_ms(10);
fang_Hz -=1;
saw_Hz -=1;
mode=1;
}
if(KEY_0 == 1 && KEY_1==1)
mode=0;
Init_config(fang_Hz,saw_Hz);//
四:DAC,DMA,TIME初期化;//ここでは正弦波のみを挙げる
//DAC
void Dac1_Init()//
{
RCC->APB1ENR|=1<<29; // DAC
RCC->APB2ENR|=1<<2; // PORTA
GPIOA->CRL&=0XFFF0FFFF;
GPIOA->CRL|=0X00000000; //PA4
DAC->CR|=1<<0; // DAC1
DAC->CR|=1<<2; // TEN1=1
DAC->CR|=0<<1; //DAC1 BOFF1=1
DAC->CR|=4<<3; //DAC TIM2 TRGO, TEN1=1
DAC->CR|=0<<6; //
DAC->CR|=0<<8;//
DAC->CR|=1<<12;//DAC1 DMA
DAC->DHR12R1=0;
}
//DMA
void DMA2_init1()
{
RCC->AHBENR|=1<<1; // DMA2
delay_ms(5); // DMA
DMA2_Channel3->CPAR=(u32)&(DAC->DHR12R1); //DMA2
DMA2_Channel3->CMAR=(u32)D_sin; //DMA2,
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
}
//
void TIM2_Int_Init(u16 arr)// TIM2--
{
RCC->APB1ENR|=1<<0; //TIM2
TIM2->CR1|=0<<4;//
TIM2->ARR=arr; //
TIM2->PSC=0; // 7200, 10Khz =72000/(899+1)=80Khz
TIM2->CR2|=2<<4; // (TRGO)
TIM2->CR1|=0x01; // 2
}
五:以上をまとめると正弦波が生成されますが、まだ少し足りないものが彼らを組織して、みんなで自分で追加すればいいです.私の才学が浅くて、構想をよく整理することができなくて、コードを提供してみんなの参考にするしかありません;もしソースが必要なものがあれば、私のqqを加えればいいです.