Forum: Mikrocontroller und Digitale Elektronik Sinus ausgeben beim STM32F10x Board


von Paul (Gast)


Lesenswert?

Hallo alle Zusammen,

ich bräuchte eure Hilfe.
Ich will bei dem STM32F10X-128K-Eval Board über den BNC Connector einen 
Sinus auszugeben. Das Programm für den Sinus hab ich schon geschrieben, 
nur mir ist nicht ganz klar,wie diese Werte an den BNC Connector 
ausgeben kann? Ich weiss das der BNC an PC1 hängt, aber um die Werte für 
den Sinus auszugeben muss ich ja den ganzen Port C benutzen.

Ich weiss jetzt nicht wie ich die Sinus Werte aus meiner Tabelle am BNC 
Connector ausgeben kann??


Mfg
Paul

von Maddin (Gast)


Lesenswert?

Mach dir doch bitte vorher gedanken wie du dein Wunschsignal erzeugen 
willst. Folgende "einfache" Möglichkeiten (unabhängig vom Board-Layout) 
hast du:

Ausgabe über PWM, anschließend Filter

Ausgabe über ADC (evt. auch Filtern)

Ausgabe über gesamten port, anschließend Seriel-AD Wandler oder sowas

Ich habe ca. 1 min gebraucht um im Userguide/Datenblatt nachzuschauen 
welches dieser Möglichkeiten bei dir in Frage kommt (30 sek davon für 
den pdf-Download) und es ist eine der genannten.


Die Sinuserzeugung die du bereits vorgenommen hast musst du eventuell 
ein bischen anpassen, da ich denke das du das entsprechende 
HardwareModul noch nicht in aktiviert/initialisiert hast.

Gruß

Maddin

von Maddin (Gast)


Lesenswert?

Maddin schrieb:
> anschließend Seriel-AD Wandler

quaaark... parallel! mann, wird zeit für Feierbend ;))

von Paul (Gast)


Lesenswert?

Danke.
Kannst du mir bitte den Link für dieses pdf schicken und mir auch sagen 
bei welcher Seite du dies gefunden hast?

Gruß
Paul

von Paul (Gast)


Lesenswert?

ich habe jetzt das Programm fertig geschrieben, ich leg meine 
Sinustabelle im Speicher ab, greif per DMA zu und schicke es über den 
DAC.

Mein problem ist jetzt, ich erhalte ke Signal an PA4 oder PA5?????

Hier mein Code:
#include "stm32f10x_lib.h"


#define DAC_DHR12RD_Address      ((u32)0x40007420)


uc16 Sine12bit[32] = {2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 
4095, 4056,
                      3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 
1263, 909,
                      599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 
1263, 1647};

u32 DualSine12bit[32];
u8 Idx = 0;



int main(void)
{
  /*********************************************************************** 
************************************************************************ 
*******************/

  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
  DAC_InitTypeDef DAC_InitStruct;
  DMA_InitTypeDef DMA_InitStruct;

  RCC_DeInit();
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, 
ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

  for (Idx= 0; Idx<32; Idx++)
    {
      DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
    }

  TIM_TimeBaseStruct.TIM_Prescaler = 0x0;
  TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStruct.TIM_Period = 0x19;
  TIM_TimeBaseStruct.TIM_ClockDivision = 0x0;
  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStruct);

  TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_Update);

  DAC_InitStruct.DAC_Trigger = DAC_Trigger_T8_TRGO;
  DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None;
  DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  DAC_Init(DAC_Channel_1, &DAC_InitStruct);
  DAC_Init(DAC_Channel_2, &DAC_InitStruct);

  DMA_DeInit(DMA2_Channel4);
  DMA_InitStruct.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;
  DMA_InitStruct.DMA_MemoryBaseAddr = (u32)&DualSine12bit;
  DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStruct.DMA_BufferSize = 32;
  DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStruct.DMA_Priority = DMA_Priority_High;
  DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA2_Channel4, &DMA_InitStruct);

    DMA_Cmd(DMA2_Channel4, ENABLE);

    DAC_Cmd(DAC_Channel_1, ENABLE);
    DAC_Cmd(DAC_Channel_2, ENABLE);

    DAC_DMACmd(DAC_Channel_2, ENABLE);

    TIM_Cmd(TIM8, ENABLE);
}

von Paul (Gast)


Lesenswert?

Kann mir bitte jemand helfen???

von Paul (Gast)


Lesenswert?

ok, hab erfahren das der stm32f103vbt6 gar keinen dac hat

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Das ist dann wohl dumm gelaufen...
Erst ab STM32F103xC (256 KBFlash) ist der drin. Ich hab daran auch nicht 
gedacht, denn die bis 128 KB Flash nehme ich schon lange nicht mehr.
Leider gibt es meist die Demo-Boards nur mit dem kleinen.

Raus holen mit dem Messer und einen größeren drauf löten (Pins am 
Gehäuse abschneiden bis das schwarze Quadrat raus fällt).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.