Är en STM32 bra att använda som USB I/O-modul?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Någon som kan förklara varför temperatureValues har inte samma värden som adcValues?
Skärmbild från 2019-01-05 03-24-33.png

Kod: Markera allt

uint8_t pwmPeriods[3] = { 0, 0, 0 }; // Get three values from PC
uint32_t temperatureValues[3]; // Send to PC
uint32_t adcValues[3] = { 55, 54, 53 }; // ADC values from temperature sensors

HAL_TIM_Base_Start(&htim3);
	HAL_TIM_Base_Start_IT(&htim2);
	HAL_ADC_Start_DMA(&hadc1, adcValues, 3);
	HAL_UART_Receive_DMA(&huart2, pwmPeriods, 3);
	HAL_UART_Transmit_DMA(&huart2, (uint8_t*) temperatureValues, 3);

	/* USER CODE END 2 */

	/* Infinite loop */
	/* USER CODE BEGIN WHILE */
	while (1) {
		/* USER CODE END WHILE */
		temperatureValues[0] = adcValues[0];
		temperatureValues[1] = adcValues[1];
		temperatureValues[2] = adcValues[2];
		/* USER CODE BEGIN 3 */
	}
Nu hittade jag. Notera att denna interrupt får jag när jag stoppar programmet. Men det som är intressanta är att jag aldrig går till while(1). Hmm...
Skärmbild från 2019-01-05 03-32-49.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av lillahuset »

Jag har inget direkt svar på din fråga men ett par tips.

Skapa en global variabel som räknas upp vid varje interrupt. Då kan du se om interrupten fungerar.
Sätt temperaturvariablerna till något nonsens när du skapar dem. Tex 0x87654321, 0x76543210, 0x65432109 så kan du se omde ändras.

Sedan finns ju alltid kreativt bruk av brytpunkter men då är det bäst att kompilera utan optimering.

Pluspoäng för "camelCase". Lycka till.
hawkan
Inlägg: 3453
Blev medlem: 14 augusti 2011, 10:27:40

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av hawkan »

Al, på minst ett annat system måste en variabel som ska uppdateras i en irq vara deklarerad som "volatile". Kolla om det behövs här.
Rick81
Inlägg: 755
Blev medlem: 30 december 2005, 13:07:09

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Rick81 »

Du ska nog inte läggs ADC läsningar i infinite loop det brukar vara kod för ej definerade interupt eller felhantering vid program krasch.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av sodjan »

Inte för att de kanske påverkar funktionen, men är inte de där
"USER CODE BEGIN WHILE" och "USER CODE END WHILE"
kommentarerna lite underliga/förvillande? Och while() avslutas
med en "USER CODE BEGIN 3"!?

För mig ger det i alla fall ett slarvigt intryck och det ger inget
förtroende för den övriga koden.
Användarvisningsbild
AndLi
Inlägg: 18251
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av AndLi »

Det är en del av cubeMX, för att kunna ändra i genererad kod och ändå ändra i den via cubeMX.

Reagerade också på att Al verkar skrivit lite på fel ställe..
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

JimmyAndersson skrev:Ursäkta off-topic, men det behöver sägas:

Tack Cosmox!! Ibland behöver man säga ifrån. :tumupp: Civilkurage är sällsynt på det här forumet. Tyvärr är mobbing fortfarande lite för vanligt.
(Naturligtvis pratar jag inte enbart om den här tråden.)

Al Bundy: Jag är imponerad över ditt tålamod och ork. Du kan bevisligen mer än vad en del tror. :)
Jag har ju ett jobb. Orsaken varför det finns ett sådant typ av folk har lite med jantelagen att göra. Oftast följs jantelagen av äldre folk för det var en typ av moral och uppfostran att inte tränga sig före i kön. Kön till att lyckas är precis som TomasL säger...först krypa, sedan gå, sedan springa osv. Men med dagens utveckling och krav på att vi måste ha bredare kunskap på arbetsmarknaden för att vara konkurrenskraftiga, genererar att det finns t.ex. högnivåspråk som gör jobbet lättare för man behöver kunna mindre då största delen av jobbet är redan gjort. På så sett så kan folk idag både vara webbutvecklare och mjukvaruprogrammerare då utvecklingsverktygen ser ut något helt annat idag än för 15 år sedan. Detta krockar väldigt mycket med den där kön som alla ska gå igenom. Helt plötsligt så finns det en genväg från krypa till springa. Sådant kan sticka i ögat på väldigt många personer som gick den hårda vägen. Fusk som det kallas.

Vi kan ta t.ex. sport där folk dopar sig för att lyckas snabbare. Nu handlar sport om att alla ska utgå från samma förutsättningar och prestera efter vem dom är. Men i arbetslivet så handlar det om att generera så mycket pengar som möjligt under kort tid. Vilket sport idag handlar mycket också om. Därför finns dopingen inom uthållighetssporter.

Så CubeMX och ST's HAL är helt enkelt fusk enligt dem som har programmerat den långa vägen. Jag kan ta ytterligare ett exempel. Vi tar olika titlar på en industri. Vi tar en tillverkningsindustri. Förr i tiden var det väldigt vanligt att man började på golvet och jobbade sig uppåt. Idag går ungdomar direkt från skolan och hoppar på konstruktörs/chefs/ekonom-jobb...bara för att dem har läst lite teori om hur det fungerar. Detta sticker också i ögat på folk som har jobbat sig upp från golvet. Från de som har jobbat sig uppåt, brukar dessa alltid hävda att praktiken är viktigast och teori hör till något annat område. Det är bara ett sätt för att övertyga sig själv att man lär sig inget på skolorna. Från de som har gått skolan så brukar dem vara väldigt teoriinriktade det första arbetsåret, tills dem lär sig att en blandning av teori och praktik behövs.

Vi får aldrig glömma att en expert är en människa som har begått alla typer utav misstag.
Senast redigerad av Al_Bundy 5 januari 2019, 12:45:39, redigerad totalt 1 gång.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Rick81 skrev:Du ska nog inte läggs ADC läsningar i infinite loop det brukar vara kod för ej definerade interupt eller felhantering vid program krasch.
Det gör jag inte. När TIM3 har snurrat klart så läser ADC:n sina värden. När TIM2 har snurrat klart så tänds en lampa.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

AndLi skrev:Det är en del av cubeMX, för att kunna ändra i genererad kod och ändå ändra i den via cubeMX.

Reagerade också på att Al verkar skrivit lite på fel ställe..
Och vad är fel ställe? Jag kan skicka större del av koden.

Kod: Markera allt

uint8_t pwmPeriods[3] = { 0, 0, 0 }; // Get three values from PC
uint32_t temperatureValues[3]; // Send to PC
uint32_t adcValues[3] = { 55, 54, 53 }; // ADC values from temperature sensors

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
	if(htim->Instance == TIM2){
		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
	}
}

/* USER CODE END 0 */

/**
 * @brief  The application entry point.
 * @retval int
 */
int main(void) {
	/* USER CODE BEGIN 1 */

	/* USER CODE END 1 */

	/* MCU Configuration--------------------------------------------------------*/

	/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
	HAL_Init();

	/* USER CODE BEGIN Init */

	/* USER CODE END Init */

	/* Configure the system clock */
	SystemClock_Config();

	/* USER CODE BEGIN SysInit */

	/* USER CODE END SysInit */

	/* Initialize all configured peripherals */
	MX_GPIO_Init();
	MX_DMA_Init();
	MX_USART2_UART_Init();
	MX_ADC1_Init();
	MX_TIM3_Init();
	MX_TIM2_Init();
	/* USER CODE BEGIN 2 */

	HAL_TIM_Base_Start(&htim3);
	HAL_TIM_Base_Start_IT(&htim2);
	HAL_ADC_Start_DMA(&hadc1, adcValues, 3);
	HAL_UART_Receive_DMA(&huart2, pwmPeriods, 3);
	HAL_UART_Transmit_DMA(&huart2, (uint8_t*) temperatureValues, 3);

	/* USER CODE END 2 */

	/* Infinite loop */
	/* USER CODE BEGIN WHILE */
	while (1) {
		/* USER CODE END WHILE */
		temperatureValues[0] = adcValues[0];
		temperatureValues[1] = adcValues[1];
		temperatureValues[2] = adcValues[2];
		/* USER CODE BEGIN 3 */
	}
	/* USER CODE END 3 */
}
Senast redigerad av Al_Bundy 5 januari 2019, 13:23:17, redigerad totalt 1 gång.
Användarvisningsbild
MJH
Inlägg: 31
Blev medlem: 26 maj 2018, 12:05:29

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av MJH »

Intressant med QP.
Att du orkar hålla dessa troll på avstånd är beundransvärt :bravo:
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

QP är riktigt intressant! En bra fördel med QP är att man slipper konfigurera mindre om man ska bara ha en enkel QP-regulator, eller MPC som det heter.

Med en PID så behövs det P,I,D parametrarna.
Med en MPC så behöver man bara ange en parameter t.ex. hur långt fram den ska titta. Man kan även ange hur långt fram den ska titta och hur mycket den ska reglera framåt. Allt beror på hur mycket data man kan hantera per samplingsintervall. Jag brukar bara sätta dessa två parametrar lika, för då har jag bara en parameter att trimma in på.

MPC använder sig inte av derivator eller integraler, utan endast räknar ut de bästa signalerna över tid. En fin sak med MPC är att med MPC så kan man kombinera det med subspaceanalys, eller subrymdidentifiering som det heter.

Vid klassisk systemidentifiering så tar du fram en mall på din modell och sedan försöker du hitta alla dessa parametrar från mättdata. Har du din modell så kan du räkna ut vilka insignaler du ska ha. Men då gäller det att du ska ha rätt modell.

Med subrymdidentifiering så behöver man inte ange vilken modell man ska ha. Det gör algoritmen åt dig och det finns oändligt med olika modeller som kan väljas på just någon millisekund.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av sodjan »

> Och vad är fel ställe?

Om du kollar kommentarerna i delen nedan så *måste* du väl se att något är fel.
Det är möjligt att koden ändå gör vad som är avsett, det bryr jag mig inte om.

Kod: Markera allt

   /* Infinite loop */
   /* USER CODE BEGIN WHILE */
   while (1) {
      /* USER CODE END WHILE */
      temperatureValues[0] = adcValues[0];
      temperatureValues[1] = adcValues[1];
      temperatureValues[2] = adcValues[2];
      /* USER CODE BEGIN 3 */
   }
   /* USER CODE END 3 */
Jag har inga andra synpunkter på koden eller på "problemet", mer än att
sådant här inte ger något förtroende generellt.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Men dessa kommentarer är automatiskt genererade.

Edit. Nu ändrade jag så att jag flyttade ut arayerna. Helt plötsligt fick dem värderna:

Kod: Markera allt

uint8_t pwmPeriods[3] = { 0, 0, 0 }; // Get three values from PC
uint32_t temperatureValues[3]; // Send to PC
uint32_t adcValues[3] = { 55, 54, 53 }; // ADC values from temperature sensors
Det betyder att temperatureValues skrivs med värden en gång från adcValues. Men programmet hoppar inte till while(1)
Skärmbild från 2019-01-05 13-50-09.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Nu fungerar det. Jag satte bara en liten delay. Vad är detta för myskologik?

Kod: Markera allt

/* USER CODE END 2 */

	/* Infinite loop */
	/* USER CODE BEGIN WHILE */
	while (1) {
		/* USER CODE END WHILE */
		temperatureValues[0] = adcValues[0];
		temperatureValues[1] = adcValues[1];
		temperatureValues[2] = adcValues[2];


		HAL_Delay(1);
		/* USER CODE BEGIN 3 */
	}
Användarvisningsbild
Klas-Kenny
Inlägg: 11831
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Klas-Kenny »

Sannolikt optimering gjord av kompilatorn.

Deklarera adcValues som volatile.

Kod: Markera allt

volatile uint32_t adcValues[3] = { 55, 54, 53 }; // ADC values from temperature sensors
Skriv svar