Forum: Mikrocontroller und Digitale Elektronik STM32 ADC liefert falsche Werte


von thnallgzt (Gast)


Lesenswert?

Hallo,
ich bin jetzt schon seit Tagen dabei, den ADC meines STM32f103c8t6 zum 
Laufen zu bekommen. Allerdings zeigt sich dabei ein sehr eigenartiges 
Verhalten: Wenn ich 0V anlege, werden Werte zwischen 1949 und 1951 
angezeigt. Zum Testen habe ich einfach nen 10k Poti an PA3 
angeschlossen, über den ich die Spannung langsam bis 3v3 hoch drehe. Bis 
ca zur Hälfte bleibt der Wert bei ~1950, geht dann runter auf 1599 und 
dann schließlich doch noch rauf bis 4095. Abwärts das gleiche Spiel.

Hier mein Code:
1
#include "stm32f10x_conf.h"
2
3
void ADCInit(void){
4
  GPIO_InitTypeDef GPIO_InitStructure;
5
  ADC_InitTypeDef ADC_InitStructure;
6
7
  RCC_ADCCLKConfig(RCC_PCLK2_Div8);
8
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
9
10
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
11
12
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_1 | GPIO_Pin_3;
13
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
14
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
15
  GPIO_Init(GPIOA, &GPIO_InitStructure);
16
17
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
18
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
19
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
20
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
21
  ADC_InitStructure.ADC_NbrOfChannel = 1;
22
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
23
  ADC_Init(ADC1, &ADC_InitStructure);
24
  ADC_Cmd(ADC1, ENABLE);
25
26
  ADC_ResetCalibration(ADC1);
27
  while(ADC_GetResetCalibrationStatus(ADC1));
28
  ADC_StartCalibration(ADC1);
29
  while(ADC_GetCalibrationStatus(ADC1));
30
}
31
32
uint16_t ADCRead (ADC_TypeDef* ADCx, uint8_t Channel){
33
34
    ADC_RegularChannelConfig(ADCx, Channel, 1, ADC_SampleTime_239Cycles5);
35
        ADC_SoftwareStartConvCmd(ADCx, ENABLE);
36
        while(ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC) == RESET);
37
    return (ADC_GetConversionValue(ADCx));
38
// Hier steht noch Code zum Umrechnung des Messwerts. Für das Problem unerheblich, daher auskommentiert und das return vorher...
39
}
40
41
int main (void){
42
43
//Haufenweise uninteressante Variablen
44
       uint16_t Ergebnis;
45
46
       SystemInit();
47
       ADCInit();
48
49
       while(1){
50
             Ergebnis = ADCRead(ADC1, ADC_Channel_3);
51
             //Ergebnis in Datei auf SD-Karte schreiben und Delay
52
53
       }
54
55
56
}

von Mike R. (thesealion)


Lesenswert?

Auf den ersten Blick sehe ich hier keinen Fehler.

Wie sieht denn die Beschaltung deines Controllers aus?

von Hart Wehr (Gast)


Lesenswert?

das Poti hängt am Nachbarpin und Du siehst nur Übersprechen?

von thnallgzt (Gast)


Angehängte Dateien:

Lesenswert?

Mike R. schrieb:
> Auf den ersten Blick sehe ich hier keinen Fehler.
>
> Wie sieht denn die Beschaltung deines Controllers aus?

Da hängt jetzt noch einiges anders Zeug dran, was aber eher unwichtig 
ist. Es sollen Akkus angeschlossen werden und Ströme und Spannungen 
gemessen werden. PA1 soll zur Strommessung dienen, deshalb ist n ACS712 
angeschlossen plus n OPV um das Signal in nen vernünftigen Messbereich 
des ADC zu bringen. PA2 soll die Spannung über nen Spannungsteiler 
messen. PA3 ist original nicht beschaltet, aber da der Pin auf der Ecke 
ist, konnte ich recht einfach ne Strippe anlöten, die zum Poti führt, 
der eigentlich zur Kontrasteinstellung des Displays gedacht ist. Das 
Display ist aktuell nicht drauf, nur die Stiftleiste.

An allen drei Pins das gleiche Verhalten. Ob ich die entsprechenden 
Spannungen also direkt über das Poti anlege oder an die anderen Pins 
durch die sonstige Beschaltung macht keinen Unterschied.

von Pete K. (pete77)


Lesenswert?

- In dem Schaltplan ist nur ein 100nF für die 3 VDD Leitungen zusehen, 
das sollen doch bestimmt mal 3 werden?
- Bei I2C fehlen die Pullups.
- Poti kaputt?

An Pin9 fehlen 1µF und 100nF.

: Bearbeitet durch User
von thnallgzt (Gast)


Lesenswert?

Pete K. schrieb:
> - In dem Schaltplan ist nur ein 100nF für die 3 VDD Leitungen
> zusehen,
> das sollen doch bestimmt mal 3 werden?
> - Bei I2C fehlen die Pullups.
> - Poti kaputt?
>
> An Pin9 fehlen 1µF und 100nF.

Poti ist nicht kaputt. Der Fehler tritt ja auch auf wenn die Spannungen 
anders eingebracht werden.
I2C hat 4k7 Pullups, wird davon abgesehen aber auch nicht für den ADC 
benötigt.

was die fehlenden Kondensatoren angeht, können die tatsächlich dafür 
verantwortlich sein? Es ist ja kein kleiner Messfehler der durch ne 
instabile Referenzspannung zustande kommt.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Hast Du ein anderes Board, z.B. ein Evalboard, zur Verfügung?
Wie verhält sich Dein Code dort.

Unabhängig davon - Kappas am Uhrenquarz - sind die notwendig?

von Pete K. (pete77)


Lesenswert?

thnallgzt schrieb:
> was die fehlenden Kondensatoren angeht, können die tatsächlich dafür
> verantwortlich sein? Es ist ja kein kleiner Messfehler der durch ne
> instabile Referenzspannung zustande kommt.

Nein, die sind bestimmt überflüssig. Das hat der Hersteller nur in das 
Datenblatt geschrieben, um die Seiten voll zu bekommen. :-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn du jemals mehr als einen Kanal messen willst, ist es evtl. 
sinnvoll, das gleich mit DMA Controller zu machen.
Hier mal ein Codeschnipsel, wie ich 4 Kanäle im Hintergrund abtaste:
1
/* Init the ADC converter to free-run with 4 channels
2
 *
3
 */
4
typedef struct ADCValues
5
{
6
  uint16_t spare1;
7
  uint16_t speedInput;
8
  uint16_t current;
9
  uint16_t temp;
10
  uint16_t spare2;
11
} ADCValues_t;
12
13
volatile ADCValues_t ADCRead;
14
15
void ADCInit(void) {
16
ADC_InitTypeDef       ADC_InitStructure;
17
DMA_InitTypeDef    DMA_InitStructure;
18
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
19
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
20
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
21
/* DMA1 channel1 configuration ----------------------------------------------*/
22
  DMA_DeInit(DMA1_Channel1);    // Clear everything we had 
23
  DMA_InitStructure.DMA_PeripheralBaseAddr =  (uint32_t)&(ADC1->DR); // Source addr
24
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCRead;      // Its always the same target address
25
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;   // from Peripheral to RAM
26
  DMA_InitStructure.DMA_BufferSize = 4;    /// Note that we have 4 Channels
27
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  // Source stays same address
28
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;     // Destination will be incremented
29
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  // 16 bit results
30
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;   // yeah same size -> 16 bit
31
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  // Wrap around the destination address
32
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;   // why not? its the only DMA thingy in this program
33
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   // we don't want RAM to RAM
34
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);   // Init the stuff finally 
35
  /* Enable DMA1 channel1 */
36
  DMA_Cmd(DMA1_Channel1, ENABLE);  // Run, but we wait for the ADC init
37
/* ADC1 configuration
38
 * 4 channel continuous
39
 */
40
  ADC_DeInit(ADC1);
41
42
ADC_StructInit(&ADC_InitStructure);
43
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
44
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
45
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
46
ADC_InitStructure.ADC_NbrOfChannel = 4;
47
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
48
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
49
/* Now do the setup */
50
ADC_DMACmd(ADC1, ENABLE);
51
ADC_Init(ADC1, &ADC_InitStructure);
52
/* Enable ADC1 */
53
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
54
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_239Cycles5);
55
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_239Cycles5);
56
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_239Cycles5);
57
ADC_Cmd(ADC1, ENABLE);
58
/* Enable ADC1 reset calibration register */
59
ADC_ResetCalibration(ADC1);
60
/* Check the end of ADC1 reset calibration register */
61
while(ADC_GetResetCalibrationStatus(ADC1));
62
/* Start ADC1 calibration */
63
ADC_StartCalibration(ADC1);
64
/* Check the end of ADC1 calibration */
65
while(ADC_GetCalibrationStatus(ADC1));
66
67
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
68
Delay(200);
69
}
Die Pins werden natürlich woanders auf AIN konfiguriert. M.E. mit dem 
STM32F103 auf dem VL Discovery zeigte auch, das ADC Kanal 0 praktisch 
immer sehr gestörte Werte hatte, weshalb ich ihn auf 'spare' gesetzt 
habe.

: Bearbeitet durch User
von thnallgzt (Gast)


Lesenswert?

Marcus H. schrieb:
> Hast Du ein anderes Board, z.B. ein Evalboard, zur Verfügung?
> Wie verhält sich Dein Code dort.
>
> Unabhängig davon - Kappas am Uhrenquarz - sind die notwendig?
Hab leider kein anderes Board.

Schaden tun sie sicher nicht :D

Pete K. schrieb:
> thnallgzt schrieb:
>> was die fehlenden Kondensatoren angeht, können die tatsächlich dafür
>> verantwortlich sein? Es ist ja kein kleiner Messfehler der durch ne
>> instabile Referenzspannung zustande kommt.
>
> Nein, die sind bestimmt überflüssig. Das hat der Hersteller nur in das
> Datenblatt geschrieben, um die Seiten voll zu bekommen. :-)

Die sind i.d.R dazu da, kurzfristige Spannungsschwankungen zu 
eliminieren. Das Fehlerbild hier sieht für mich aber nicht danach aus. 
Sonst müssten die Messungen über den gesamten Messbereich Schwankungen 
aufweisen.
Auf die letztendliche Genauigkeit der Werte bin ich noch gar nicht 
eingegangen, habe bisher lediglich "ungefähr" überprüft ob die ADC-Werte 
zu den angelegten Spannungen passen. Da kann natürlich immer noch ein 
Fehler aufgrund der fehlenden Caps drin sein, das will ich gar nicht 
bestreiten. Aber Das Verhalten zwischen 0 und 1,3V (der angezeigte Wert 
1599) ist doch ein bisschen heftiger falsch.



Die anderen Komponenten, I2C, SPI, PWM, RTC usw funktionieren ja 
einwandfrei...

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

thnallgzt schrieb:
>> Unabhängig davon - Kappas am Uhrenquarz - sind die notwendig?
> Schaden tun sie sicher nicht :D
AN2867 / AN3371

von Pete K. (pete77)


Lesenswert?

Hast Du mal die anliegende Spannung für den ADC direkt am PIN des STM32 
gemessen? Passt das zu der Eingangsgröße?

Oder werden 1,3V gemessen obwohl am PIN 1,6V anliegen? Das ist mir noch 
nicht ganz klar. Vielleicht liegt der Fehler ja auch in der 
Vorbeschaltung des ADC.

von chris (Gast)


Lesenswert?

Matthias S. schrieb:
> M.E. mit dem
> STM32F103 auf dem VL Discovery

Auf dem VL-Discovery sitzt ein STM32F100RBT6

von thnallgzt (Gast)


Lesenswert?

Marcus H. schrieb:
> thnallgzt schrieb:
>>> Unabhängig davon - Kappas am Uhrenquarz - sind die notwendig?
>> Schaden tun sie sicher nicht :D
> AN2867 / AN3371

Wie auch immer, die RTC funktioniert doch.
Pete K. schrieb:
> Hast Du mal die anliegende Spannung für den ADC direkt am PIN des
> STM32
> gemessen? Passt das zu der Eingangsgröße?
>
> Oder werden 1,3V gemessen obwohl am PIN 1,6V anliegen? Das ist mir noch
> nicht ganz klar. Vielleicht liegt der Fehler ja auch in der
> Vorbeschaltung des ADC.

Ich hab die Spannung direkt am Pin gemessen.
OV am Pin -> 1951 im Register ≙ 1,57V
Spannung steigt, Wert im Register fällt bis
1,28V am Pin -> 1599 im Register ≙ 1,28V, ab da bis 3,3V alles wie es 
sein soll.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

chris schrieb:
> Auf dem VL-Discovery sitzt ein STM32F100RBT6

Wo er recht hat, hat er recht.

von Pete K. (pete77)


Lesenswert?

Hast Du hier schon mal geschaut:
Beitrag "Re: STM32 ADC Verhalten eigentümlich"

Evtl. ein Problem mit Kapazitäten am Ain?

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

- Welche IDE? Ggf. Testprojekt posten.

- GPIO_InitStructure komplett vorbelegen - GPIO_StructInit

- setze den ADC mal auf freilaufend und schau Dir das Wandlungsergebnis 
direkt in der main-loop an

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Ist ein paar Jahre her, dass ich das VL-Disco in Betrieb hatte.
Dein Code läuft ohne wesentliche Änderung in der u.s. Form.

Ein 1k Poti hängt am PA1. Die Werte laufen zwischen 0..3V3 sauber von 
0..4095.
1
  GPIO_InitTypeDef GPIO_InitStructure;
2
    ADC_InitTypeDef ADC_InitStructure;
3
4
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
5
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
6
7
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
8
9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
11
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
12
    GPIO_Init(GPIOA, &GPIO_InitStructure);
13
14
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
15
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
16
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
17
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
18
    ADC_InitStructure.ADC_NbrOfChannel = 1;
19
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
20
    ADC_Init(ADC1, &ADC_InitStructure);
21
    ADC_Cmd(ADC1, ENABLE);
22
23
    ADC_ResetCalibration(ADC1);
24
    while(ADC_GetResetCalibrationStatus(ADC1));
25
    ADC_StartCalibration(ADC1);
26
    while(ADC_GetCalibrationStatus(ADC1));
27
28
29
  while(1)
30
  {
31
      ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
32
      ADC_SoftwareStartConvCmd(ADC1, ENABLE);
33
      while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)   {;}
34
      printf( "%d\r\n", ADC_GetConversionValue( ADC1 ) );
35
    volatile int i;
36
    for(i=0; i<100000; i++){;}
37
  }

von thnallgzt (Gast)


Lesenswert?

IDE ist CooCox

Ich habe es jetzt nochmal direkt in der main probiert, selbes Ergebnis.
Dann habe ich mal den GPIOB Port probiert, Genau genommen PB1 
(ADC_Channel9), auch nicht anders. Selbst, wenn man die Initialisierung 
der GPIO Pins gänzlich weg lässt bleibt das Verhalten dasselbe.

von Pete K. (pete77)


Lesenswert?

Doch Hardwareproblem?

von C. H. (hedie)


Lesenswert?

AIN0 hat einen internen Defekt.
Dies steht im Errata.

von thnallgzt (Gast)


Lesenswert?

Pete K. schrieb:
> Doch Hardwareproblem?
Also der µC selbst defekt?
Und da es quasi unmöglich ist den zu tauschen muss gleich das ganze 
Board neu. Dann können auch gleich die restlichen Caps eingebaut werden.
Claudio H. schrieb:
> AIN0 hat einen internen Defekt.
> Dies steht im Errata.

Ich benutze aber auch andere Pins.

von Pete K. (pete77)


Lesenswert?

Kannst Du die Caps nicht in den vorhandenen Board nachrüsten? Nur um 
diese Fehlerquelle auszuschließen...

von Christian J. (Gast)


Lesenswert?

Hallo,

ich habe gestern genau eine solche Routine für einen STM32F103C8t& 
codiert  für AIN0 (Baujahr 2015, Week 47)und sie läuft einwandfrei. Ohne 
das jetzt alles durchzulesen hier mein Code, der einwandfrei läuft. Wie 
ich sehe wurde einiges von dem STM32 Genius "clive1" kopiert aus 
"stackoverflow".... schreiben wohl alle vom gleichen ab :-)
1
void Init_LDR()
2
{
3
    ADC_InitTypeDef ADC_InitStructure;
4
    GPIO_InitTypeDef  GPIO_InitStructure;
5
6
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    // GPIOA Clock enable
7
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);    // ADC Clock enable
8
9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               // AN0 Pin (PA0) aktivieren
10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
11
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
12
    GPIO_Init(GPIOA, &GPIO_InitStructure);
13
14
    /* ADC Common Init */
15
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
16
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;           // 1 Channel
17
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;     // Scan on Demand
18
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
19
    ADC_InitStructure.ADC_NbrOfChannel = 1;
20
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
21
    ADC_Init(ADC1, &ADC_InitStructure);
22
23
    /* ADC1 Kanal 0 configuration */
24
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // PA1
25
    ADC_Cmd(ADC1, ENABLE);
26
27
    /* Enable ADC1 reset calibaration register */
28
    ADC_ResetCalibration(ADC1);
29
30
    /* Check the end of ADC1 reset calibration register */
31
    while(ADC_GetResetCalibrationStatus(ADC1));
32
33
    /* Start ADC1 calibaration */
34
    ADC_StartCalibration(ADC1);
35
36
    /* Check the end of ADC1 calibration */
37
    while(ADC_GetCalibrationStatus(ADC1));
38
39
   /* Starte Wandlung */
40
   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
41
}

von Pete K. (pete77)


Lesenswert?

@Christian: Wie sieht bei Dir die Hardwarebeschaltung an Pin9 aus 
(Kondis)?

von Christian J. (Gast)


Lesenswert?

Pete K. schrieb:
> @Christian: Wie sieht bei Dir die Hardwarebeschaltung an Pin9 aus
> (Kondis)?

Pin 9 ist PC1 bei 64Pinner. Was soll da sein? Der ist nicht rausgeführt. 
Ich habe ein fertiges Minimum DevBoard für 7 Euro.

von Christian J. (Gast)


Lesenswert?

Sorry,

VDDA ist an +3.3V mit 100nf Block.

von thnallgzt (Gast)


Lesenswert?

Habe jetzt ein Evaluation Board (eins auch China von LC glaub ich). Beim 
Vorbenutzer funktionierte es. Da sollte die Beschaltund dex STM ja in 
Ordnung sein bzgl. Caps etc.
Ich habe jetzt also ein neues Projekt in Coocox angelegt, ohne 
Schnickschnack und sonstwelche includes. Habe meinen Code, den von 
Christian J. und den von Marcus H. probiert. Alles dasselbe. Exakt das 
Fehlerbild wie schon immer. Ich denke mal, dass ein Hardwaredefekt wegen 
des Eval Boards trotzdem ausgeschlossen werden kann.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Gut, dann glauben wir Dir mal, dass die Hardware hinreichend verifiziert 
wurde. Selbst das Poti hast Du getestet.
Es gibt auch Hinweise, dass das Codeschnitzel passt.

Dann geht es mit dem restlichen Projekt weiter, sprich der 
Systeminitialisierung. Taktsystem etc...

Hast Du eine RS232 angeschlossen, oder sonstige Nachweise, dass Dein 
Systemtakt richtig parametriert ist?



Ich meine, wir könnten Dir auch ein CooCox "Hello World" hochladen, aber 
das willst Du sicher nicht.
Magst Du vielleicht Dein Projekt irgendwo reinstellen? Nach einem 
"clean" sind das ja nur noch wenige 100kB.

von thnallgzt (Gast)


Lesenswert?

Ich meine mich daran zu erinnern, dass ich den I2C Takt mal aufm Logic 
Analyzer richtig abgelesen habe.
Aber ich kann nachher auch nochmal ne PWM testen um sicher zu gehen.

Hier der Projektordner: http://thnallgzt.no-ip.org/misc/testprojekt.zip

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Hi :)
Bitte Schaltplan vom Evalboard.
Bisher kenn ich nichtmal Deinen Quarztakt.

Im Projekt steht HSE_VALUE auf 8MHz, auf Deinem eingänglichen 
Schaltplanfragment ist nur der zu langsam laufende Uhrenquarz zu sehen, 
der Systemquarztakt ist durchgesägt...

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Sooo,

ich habe Deinen Makrovirus mal bei mir ins CooCox gehängt.
Testplattform STM32VLDISCOVERY, d.h STM32F100RB.

Kleine Änderungen:
 - printf-reingehängt
 - ST-Link auf 300kbps runtergedreht

Wesentliches Ergebnis - es läuft wie erwartet.
Sowohl mein Code, siehe oben, als auch Dein Code.

Wenn Du Dich beim Forum anmeldest, schicke ich Dir das Projekt gerne als 
PM.

Grüße,
 Marcus

: Bearbeitet durch User
von Markus P. (thnallgzt)


Angehängte Dateien:

Lesenswert?

Auf dem Board ist ein 8MHz Quarz. Auf meiner Platine ein 12MHz, da habe 
ich dann in der config die Zeile
1
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
mit nem passenden Teiler versehen um auf wieder 72MHz zu kommen.

Ich den ST-Link hab ich jetzt auch auf 300kbps geändert, natürlich ohne 
Erfolg.

Ich versuche mal, den Schaltplan vom Board gleich anzuhängen.

: Bearbeitet durch User
von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Guten Morgen,
siehe PM.

Mein Testprojekt verwendet zufällig dieselben USART-Pins wie das 
Eval-Board - spätestens dann sehen wir ob die Takte passen.

Auf dem 8MHz Evalboard sollte mein Projekt einfach laufen.


Grüße,
 Marcus

von Markus P. (thnallgzt)


Lesenswert?

Kommando zurück! Ich hab keine Ahnung mehr, was ich gestern veranstaltet 
habe. Aber jetzt funktioniert mein Testprojekt auf dem Eval Board wie es 
soll. Kann sein, dass der Poti nicht richtig drauf saß. Jedenfalls hab 
ich auf dem Evalboard wieder PA4 für den Poti genommen, alles sauber. 
Den Takt ungestellt (laut gemessener Frequenz der PWM passt es auch) und 
direkt an meiner Platine probiert. Der Fehler ist noch da.

Ich habs jetzt mehrfach geprüft, ob überall Masse ist wo welche sein 
soll etc.

Es kann also davon ausgegangen werden, dass ich gestern Mist gebaut 
habe, als ich gesagt habe, es liege nicht an der Hardware.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Markus P. schrieb:
> Es kann also davon ausgegangen werden, dass ich gestern Mist gebaut
> habe, als ich gesagt habe, es liege nicht an der Hardware.

Danke Dir für die offene Rückmeldung.
Das hatte der Hardwerker im Gefühl, als er schrieb:
"Gut, dann glauben wir Dir mal, dass die Hardware hinreichend 
verifiziert
wurde. Selbst das Poti hast Du getestet." ;)

War zwar etwas Arbeit, aber das ist mal wieder ein Paradebeispiel dafür, 
dass embedded Debugging nach Checkliste auf der Leiterplatte losgeht.

Das Problemchen auf Deiner Hardware findest Du auch noch. :D

von Markus P. (thnallgzt)


Lesenswert?

Die fehlenden Kondensatoren habe ich nachgerüstet.
Also wieder die Angstdiagnose: Controller defekt?

von Robert S. (robert_s68)


Lesenswert?

Markus P. schrieb:
> Also wieder die Angstdiagnose: Controller defekt?

LQFP48 gehäuse? da sollte sich ein einzelner AIN pin mit einem feinen 
lötkolben + schraubenzieher abheben lassen, dann kann man den pin direkt 
auf masse legen, und so schaun ob der µc was hat.

von Markus P. (thnallgzt)


Lesenswert?

Robert S. schrieb:
> Markus P. schrieb:
>> Also wieder die Angstdiagnose: Controller defekt?
>
> LQFP48 gehäuse? da sollte sich ein einzelner AIN pin mit einem feinen
> lötkolben + schraubenzieher abheben lassen, dann kann man den pin direkt
> auf masse legen, und so schaun ob der µc was hat.

Das gleiche, als wenn er über den Poti auf Masse liegt.

Ich wechsle dann morgen mal den Controller und hoffe, dass wenigstens 
das einigermaßen unfallfrei klappt.

von Markus P. (thnallgzt)


Lesenswert?

Hab den Controller gewechselt. Jetzt läuft alles wie es soll.

Vielen Dank euch allen für die Hilfe :)

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.