Förslag på olika funktionsblock

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Mindmapper
Inlägg: 6389
Blev medlem: 31 augusti 2006, 16:42:43
Ort: Jamtland

Re: Förslag på olika funktionsblock

Inlägg av Mindmapper »

PLC marknaden är väldigt stor, det finns också en väldig massa olika styrsystem, stora, små, distribuerad IO etc etc. De stora säljer på sin tillförlitlighet och att de täcker ett stort område. Många billiga har grundfunktionaliteten men konkurrerar med sitt pris.

Svårigheterna inom styrsystemmarknaden är nog att få funktionalitet både på firmware, software och elektronik. De här grejorna ska fungera dag ut och dag in i en taskig elektrisk miljö. Du ska inte behöva starta om det för minnesläkage eller för att det hänger sig. De ska ha ett bra program för att programmeras att utföra det som krävs. Att sedan få elektroniken skyddad så att både digitala och analoga IO samt kommunikationsgränssnitt inte går sönder. Dessutom ska övrig elektronik ha matningsspänningar som aldrig får balla ur. Helst ska du också ha en livslängd på 30-50år.

Ska man hitta en nisch inom styrteknik ska man definitivt inte satsa på att konkurrera med de stora. Att hitta ett smalt område där man kan smyga in är nog lösningen. Nu hade ju ts inte några sådana mål annat än att få till några system för att han och eventuellt kompisarna skulle "leka". Så tolkade jag det hela.
På 90-talet skulle dataindustrin konkurerra med PLC. Många satsade på att ta fram industri PC. De blev dyra grejor sedan de anpassat sina PC för att klara den svåra industrimiljön. Ts har i detta fall börjat på rätt väg med en processor som han bygger runt, istället för att ta en befintlig plattform och bygga om den till något den inte var avsedd till i från början. Its a long way to Tipparary.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på olika funktionsblock

Inlägg av DanielM »

Nu har jag implementerat mina program :)

Det blev.

Kod: Markera allt

	ILI9341_print_text("Program0:No program", 55, 35, COLOR_YELLOW, COLOR_NAVY, 1);
	ILI9341_print_text("Program1:PI control", 55, 45, COLOR_YELLOW, COLOR_NAVY, 1);
	ILI9341_print_text("Program2:Pulse count", 55, 55, COLOR_YELLOW, COLOR_NAVY, 1);
	ILI9341_print_text("Program3:MRAC control", 55, 65, COLOR_YELLOW, COLOR_NAVY, 1);
	ILI9341_print_text("Program4:ON/OFF control", 55, 75, COLOR_YELLOW, COLOR_NAVY, 1);
	ILI9341_print_text("Program5:Input and output PWM", 55, 85, COLOR_YELLOW, COLOR_NAVY, 1);
	ILI9341_print_text("Program6:Input and output Analog", 55, 95, COLOR_YELLOW, COLOR_NAVY, 1);
	ILI9341_print_text("Program7:Digital output alarm", 55, 105, COLOR_YELLOW, COLOR_NAVY, 1);
	ILI9341_print_text("Program8:Auxiliary valve command", 55, 115, COLOR_YELLOW, COLOR_NAVY, 1);
	ILI9341_print_text("Program9:General purpose valve command", 55, 125, COLOR_YELLOW, COLOR_NAVY, 1);
Om ni undrar vad Auxiliary valve command och General purpose valve command är så är det standarder inom ISO 11783-7 för att kommunicera med ventiler.
MRAC är adaptiv PI-regulator.

En nyfiken fråga!

Jag har en interrupt som aktiveras när min räknare känner utav Capture Compare(ett förändrat värde) hos en ADC. Då anropar min interrupt ADC och läser ett värde. Detta resulterar att min övriga kod blir lite seg. Är det smart att ha en interrupt på en ADC om processorn ska göra andra saker samtidigt?

Ja. Jag kan BARA ha Capture Compare och "Software trigger". Software trigger betyder att mjukvaran själv bestämmer när den vill läsa ADC. Jag tycker det låter lite riskabelt. Bättre då att ha en räknare.

Men det kanske är bättre att jag inte har en interrupt på en ADC över huvud taget om jag bara kan ha Capture Compare som trigger?
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Förslag på olika funktionsblock

Inlägg av ToPNoTCH »

Nu blandar du nog begreppen en aning.

CCP är nog något du fått om bakfoten.
Det är inte till för att periodiskt kontrollera ett värde, och troligtvis använder du inte CCP heller.

Det du skall göra är att sätta en interrupt på en timer och låta denna med jämna mellanrum trigga en avläsning och jämföra med tidigare resultat.
Om ADC'n är den interna i processorn eller extern på I2C så kan du med fördel använda DMA.
På så vis behöver du inte ställa frågan till ADC'n vid varje interrupt. Värdet finns där redan genom DMA.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på olika funktionsblock

Inlägg av DanielM »

ToPNoTCH skrev: 6 augusti 2021, 17:28:16 CCP är nog något du fått om bakfoten.
Det är inte till för att periodiskt kontrollera ett värde, och troligtvis använder du inte CCP heller.
Jo. Jag använder en Capture Compare trigger.
En trigger som exekverar om det har blivit en skillnad.
Notera att jag använder Sigma Delta ADC 16-bit.
Skärmklipp.PNG
Skärmklipp.PNG
Det du skall göra är att sätta en interrupt på en timer och låta denna med jämna mellanrum trigga en avläsning och jämföra med tidigare resultat.
För Input Capture och DAC så har jag en sådan trigger som anropar en interrupt och då körs en viss funktion.
Om ADC'n är den interna i processorn eller extern på I2C så kan du med fördel använda DMA.
På så vis behöver du inte ställa frågan till ADC'n vid varje interrupt. Värdet finns där redan genom DMA.
Jag tror du har en poäng där.
Däremot för Input Capture så måste jag nog ha en interrupt för den ska mäta frekvens.

Däremot för Sigma Delta ADC och Encoder, som normalt exekverar sin interrupt vid förändringar, där skulle jag kunna använda DMA.

Edit:
Tror jag har hittat en lösning nu för DMA hos Input Capture.

Edit2:
Jag har nu bytt ut interrupt mot DMA. Annars är koden inte förändrad. Räknarna är exakt som förut.

Kod: Markera allt

	/*
	 * For TIM12, TIM13 and TIM16
	 * Timer clock: 48 Mhz
	 * Prescaler: 0
	 * Counter: 48000 (0xbb80)
	 * Update frequency: 1000 Hz
	 */
	HAL_TIM_OC_Start(htim13, TIM_CHANNEL_1); /* TIM13 is trigger source for SDADC1 */
	HAL_TIM_OC_Start(htim12, TIM_CHANNEL_1); /* TIM12 is trigger source for SDADC2 */
	HAL_TIM_OC_Start(htim16, TIM_CHANNEL_1); /* TIM16 is trigger source for SDADC3 */
	if (HAL_SDADC_CalibrationStart(hsdadc1, SDADC_CALIBRATION_SEQ_1) != HAL_OK)
		Error_Handler();
	if (HAL_SDADC_CalibrationStart(hsdadc2, SDADC_CALIBRATION_SEQ_1) != HAL_OK)
		Error_Handler();
	if (HAL_SDADC_CalibrationStart(hsdadc3, SDADC_CALIBRATION_SEQ_1) != HAL_OK)
		Error_Handler();
	if (HAL_SDADC_PollForCalibEvent(hsdadc1, HAL_MAX_DELAY) != HAL_OK)
		Error_Handler();
	if (HAL_SDADC_PollForCalibEvent(hsdadc2, HAL_MAX_DELAY) != HAL_OK)
		Error_Handler();
	if (HAL_SDADC_PollForCalibEvent(hsdadc3, HAL_MAX_DELAY) != HAL_OK)
		Error_Handler();
	if(HAL_SDADC_InjectedStart_DMA(hsdadc1, (uint32_t*)SDADC1_Single, 9) != HAL_OK)
		Error_Handler();
	if(HAL_SDADC_InjectedStart_DMA(hsdadc2, (uint32_t*)SDADC2_Single, 3) != HAL_OK)
		Error_Handler();
	if(HAL_SDADC_InjectedStart_DMA(hsdadc3, (uint32_t*)SDADC3_Differential, 5) != HAL_OK)
		Error_Handler();
Men ett litet problem så är dessa 0 och verkar inte alls ändras. Varför då?

Kod: Markera allt

volatile static int16_t SDADC1_Single[9];
volatile static int16_t SDADC2_Single[3];
volatile static int16_t SDADC3_Differential[5];
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar