Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Nej. Det var fel på mig.

När jag skickade

Kod: Markera allt

1ABCDEFGHIJKLMNOPQRSTUVWZ
Via CuteCom (program) så skickade jag egentligen

Kod: Markera allt

1ABCDEFGHIJKLMNOPQRSTUVWZ\n
Så det var 26 tecken. Jag testade att rengöra PCB kortet igen och nu for alla störningar bort. Jag kör på 9600 baudrate.

Problemet som jag har är att det är ett dåligt protokoll.
Först skickar jag 25 bytes med kommandon. Då svarar min apparat med 23 bytes av mätdata. Men går det lite för snabbt, så finns det risk att det blir felindexering. Så där har jag ett problem.
Enklaste är att köra med 100 ms per meddelande. Men sådant är inte seriöst.

Eller det kanske är snabbt med tanke på att jag skickar 25 bytes åt gången? Jag menar, jag kan lika gärna skicka 1000 bytes per 100 ms.
Problemet är att det är ju en vanlig PC som kommunicerar med ett realtidssystem(STM32). Skulle datorn vara lite seg så kanske två meddelanden blir ett meddelande.

Vad tror ni om detta protokoll?

Kod: Markera allt

TX: status data
Där status är bara 1 byte och data är 24 byte när det kommer till Dator -> PC
Då har jag först meddelandet:

Kod: Markera allt

0 X
Där nolla betyder "Invänta meddelande". X i detta fall är data som inte räknas.
Då förväntar jag mig svar från STM32 -> Dator

Kod: Markera allt

1 X
Där 1 är "OK"

Då skickar jag mitt meddelande från Dator -> STM32

Kod: Markera allt

2 Data
När jag har skickat min data så förväntar jag mig att få mätvärden tillbaka från STM32 -> Dator

Kod: Markera allt

3 Data
Är detta ett OK protokoll? Jag har självklart blocking på så att jag verkligen inväntar X antal bytes.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45299
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av TomasL »

Problemet som jag har är att det är ett dåligt protokoll.
Först skickar jag 25 bytes med kommandon. Då svarar min apparat med 23 bytes av mätdata. Men går det lite för snabbt, så finns det risk att det blir felindexering. Så där har jag ett problem.
Enklaste är att köra med 100 ms per meddelande. Men sådant är inte seriöst.

Eller det kanske är snabbt med tanke på att jag skickar 25 bytes åt gången? Jag menar, jag kan lika gärna skicka 1000 bytes per 100 ms.
Problemet är att det är ju en vanlig PC som kommunicerar med ett realtidssystem(STM32). Skulle datorn vara lite seg så kanske två meddelanden blir ett meddelande.
Varför använder du inte ett industristandard protokoll som Modbus?

>Och nej, det du föreslår är mer än uselt.
Användarvisningsbild
ffredrik
Inlägg: 343
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av ffredrik »

Exakt. Sådana här protokoll skall man inte hitta på själv om man inte är expert och har erfarenhet. Använd en standardlösning i stället!
hummel
Inlägg: 2268
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av hummel »

Om du nu av någon anledning ska skapa ett eget protokoll vad för typ av checksumma använder för att detektera trasig data? Vilken typ av handskaning har du i protokollet? Hur sköter du omsändningar?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45299
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av TomasL »

Dessutom, om du skapar ett eget protokoll så lär ingen i hela världen kunna prata med dig, eftersom alla andra använder standardiserade protokoll.
H.O
Inlägg: 5715
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av H.O »

Och ändå, så kommer det nya protokoll, nya språk, nya standarder och nya specifikationer ideligen...
Skärmklipp.PNG
EDIT: Men, för att förtydliga, man bör ha en bra anledning att inte använda nått som redan är en "standard"...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45299
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av TomasL »

Jovisst är det så, det ser vi hela tiden, men industrin, använder trotts allt alltid det gamla och beprövade, oavsett nya påhitt
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

TomasL skrev: 3 januari 2021, 01:02:18 Dessutom, om du skapar ett eget protokoll så lär ingen i hela världen kunna prata med dig, eftersom alla andra använder standardiserade protokoll.
Tror det blir lite för komplext. Men finns det färdigt bibliotek till detta i Java och C så tar jag gärna detta.
Jag har använt J1939 för CAN-bus. Det var bra. Men problemet är att jag måste bygga logiken själv.
hummel skrev: 3 januari 2021, 00:58:28 Om du nu av någon anledning ska skapa ett eget protokoll vad för typ av checksumma använder för att detektera trasig data? Vilken typ av handskaning har du i protokollet? Hur sköter du omsändningar?
Jag dekterar inte trasig data. Det jag har gjort är att jag sätter en DMA på 25 bytes hos min STM32 och kopplar den till en interrupt. När min STM32 får exakt 25 bytes, eller mer, så körs en funktion som läser bufferten och utför kommandon som den ska göra. Där efter tömmer bufferten. Så får den för mycket, så skrotar den datan. Skulle den också få för mycket så larmar den igenom att skicka tillbaka ett felvärde. Jag vet inte vad du menar med handskakning, men jag börjar först fråga processorn om den är redo att ta emot data. Då svarar den antingen 1 eller 0. Är det 1 så skickar jag min data och inväntar mätvärden. Jag har hört detta på 10 ms och det har fungerat bra, trots att min dator är 13 år gammal och väldigt varm.

Hur som helst så har jag fått det att fungera nu. Men jag är öppen för ett bättre protokoll. Men jag är inte rädd för ett protokoll. Jag är snarare rädd för att oavsett protokoll, så är det inte störningskänsligt. Så då spelar det ingen roll om jag har Modbus som protokoll eller J1939 som protokoll. Det går åt skogen om man skulle få så mycket störningar så att den missuppfattar 49 för 50. Då finns det inget som jag kan göra, utan jag får acceptera felvärdet.

Så här skickar jag min data. Jag bara gör en förfrågan om enheten är upptagen eller inte. Enkelt svar tillbaka. Jag kan köra så pass snabbt att till och med datorn håller på hänga efter.

Kod: Markera allt

// Control loop - When sampling thread are done, then this will quit too
			while (ControlView.loggingNow.get()) {
				
				// Ask if ready and then check
				serial.askIfReady();
				if(!serial.isOK())
					continue;

				// Send PWM and DAC
				PWM[0] = ControlView.sliderSelectedP0;
				PWM[1] = ControlView.sliderSelectedP1;
				PWM[2] = ControlView.sliderSelectedP2;
				PWM[3] = ControlView.sliderSelectedP3;
				PWM[4] = ControlView.sliderSelectedP4;
				PWM[5] = ControlView.sliderSelectedP5;
				PWM[6] = ControlView.sliderSelectedP6;
				PWM[7] = ControlView.sliderSelectedP7;
				PWM[8] = ControlView.sliderSelectedP8;
				DAC[0] = ControlView.sliderSelectedD0;
				DAC[1] = ControlView.sliderSelectedD1;
				DAC[2] = ControlView.sliderSelectedD2;
				serial.transceive_PWM_DAC(PWM, DAC);

				// Receive ADC, SDADC, DSDADC and DI
				serial.receive_ADC_SDADC_DSDADC_DI(ADC, SDADC, DSDADC, DI);
			}
För motsvarande sida.

Kod: Markera allt

// When we got a complete RX message - This function runs
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
	/* Prevent unused argument(s) compilation warning */
	UNUSED(huart);

	/* NOTE : This function should not be modified, when the callback is needed,
	 the HAL_UART_RxCpltCallback can be implemented in the user file.
	 */

	uint8_t choice = RX_DATA[0];
	switch (choice) {
	case 48: // Ask if is ready
		is_ready();
		break;
	case 49: // Set PWM and DAC periods and also send measurements back
		read_PWM_DAC_periods_send_measurement_back();
		break;
	case 50: // Set Timers prescalers to memory and send status OK back
		write_PWM_TIM_prescalers_to_memory();
		break;
	default: // Answer back that this uC is not ready
		is_not_ready();
		break;
	}
}
Jag testade även att köra lite PWM med mitt oscilloskop. Det verkar som att oavsett jag sätter prescaler-värderna till, så visar den bara samma frekvens. Gör jag något fel?
Jag har ställt in Timer klockan på 2 Mhz.
namn.png
Bevis på att jag har valt rätt timers
namn.png
Det jag gör för att ändra prescaler.

Kod: Markera allt

int[] prescalerValues = new int[4];
prescalerValues[0] = MAX_VALUE_INTEGER_FIELD / P4_Value -1; //TIM2
prescalerValues[1] = MAX_VALUE_INTEGER_FIELD / P6_P5_Value -1; //TIM3
prescalerValues[2] = MAX_VALUE_INTEGER_FIELD / P3_P7_P8_Value -1; //TIM4
prescalerValues[3] = MAX_VALUE_INTEGER_FIELD / P0_P1_P2_Value -1; //TIM5
Där MAX_VALUE_INTEGER_FIELD är 2*10^6 Hz = 2 000 000 Hz
Så om jag vill ha 300 Hz som PWM, så sätter jag t.ex. P4_Value = 300.
Då blir

Kod: Markera allt

prescalerValues[0] = MAX_VALUE_INTEGER_FIELD / P4_Value - 1 = 2*10^6 / 300 - 1 = 6665
Tar jag 6665 som prescaler för (i detta fall) htim2.Init.Prescaler så skalar jag ned TIM2 till 300 Hz då 2*10^6 Hz / 6665 = 300 Hz

Sedan när jag sätter prescaler

Kod: Markera allt

htim2.Init.Prescaler = TIM_PRESCALES[0];
htim3.Init.Prescaler = TIM_PRESCALES[1];
htim4.Init.Prescaler = TIM_PRESCALES[2];
htim5.Init.Prescaler = TIM_PRESCALES[3];
Men inget verkar hända. Hmm....
Jag kan se att värdera sätts igenom debuggern.

Edit:

Löste det nu. Det skall vara så här. Man blir lite lurad av ST :wink:

Kod: Markera allt

htim2.Instance->PSC = TIM_PRESCALES[0];
htim3.Instance->PSC = TIM_PRESCALES[1];
htim4.Instance->PSC = TIM_PRESCALES[2];
htim5.Instance->PSC = TIM_PRESCALES[3];
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av DanielM 3 januari 2021, 13:25:23, redigerad totalt 2 gånger.
Användarvisningsbild
AndLi
Inlägg: 17136
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av AndLi »

> Men jag är inte rädd för ett protokoll. Jag är snarare rädd för att oavsett protokoll, så är det inte störningskänsligt.
Alla är vi rädda för olika saker, jag skulle nog säga att normen är att vara rädd för att protokollet är störningskänsligt, inte tvärt om :)

>Så då spelar det ingen roll om jag har Modbus som protokoll eller J1939 som protokoll. Det går åt skogen om man skulle få så mycket störningar så att den missuppfattar 49 för 50. Då finns det inget som jag kan göra, utan jag får acceptera felvärdet.
Ett bitfel är det minsta man kan kräva av ett protokoll att detektera och klara av att hantera!

Att du måste gå ner och köra i 9600 visar tydligt på att ditt protokoll har enorma brister, och sannolikt även din implementation.

>Problemet är att det är ju en vanlig PC som kommunicerar med ett realtidssystem(STM32). Skulle datorn vara lite seg så kanske två meddelanden blir ett meddelande.
Hur kan två meddelande bli ett, du har ju fast längd på dina meddelande, så varje meddelande är väl alltid 25 tecken...
Och det är inga problem för ett realtidsystem att kommunicera med något icke realtidsprocess (vanlig PC eller något annat), är det det har man gjort fel...
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Nej. Jag kör bara 9600 för att vara på den säkra sidan. Jag kan lika gärna köra 115200 b/s.

Det som gjorde lösningen var att jag behövde låta datorn vänta på svar. Först så skickade jag bara data, vänta 10 ms och sedan läs. Detta dög inte. Då frågar jag den istället om den är redo att ta emot data och inväntar svar direkt.

Och...jag rengjorde lite vitt från en RX pinne. Troligtvis var det fluss som hade farit över på GND planet.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14861
Blev medlem: 16 april 2006, 17:04:10

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av mrfrenzy »

Du säger att du använt J1939, då vet du ju hur en checksumma används och hur omsändningar och pakethantering går till, det är något som alla vettiga protokoll hanterar.
Varför uppfinna hjulet på nytt? Repetera J1939-standarden och implementera det, eller ta CANopen som är lite enklare men relaterat.

Modbus som nämnts är ju heller inget fel på.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Alltså, jag har inte skrivit ett J1939 bibliotek. Jag bara använde allt färdigt och anropade efter ett datablad. Därför var det smidigt för någon annan hade gjort jobbet.

Däremot att implementera J1939 för att bara säga "hej" mellan två enheter, är verkligen att förstöra för sig själv.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Nu hittade jag felet.
När jag kopplar på ström på en spole och sedan ned på PWM ingången så stängs uC ned för att det blir en spänningspeak.

Kopplade på ett motstånd och diod för att minska denna spik.

Så detta var orsaken.

Sedan skulle GND vara helst separat från uC.
Men kortet fungerar! :tumupp:
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Nyfiken fråga!

Jag tänkte bygga ihop en encoder som mäter PWM puls till 4-20mA. Jag tänker använda STM32F1 till detta och skicka ut en 4-20mA signal mitt större PCB kort.
Om ingen annan har någon synpunkt & råd på PWM encoder till 4-20mA för en STM32 så tänker jag påbörja nu. :)

Jag vill ha en liten STM32 och den minsta jag hittar har bara 2 stycken DAC. Hojta till om ni har andra rekommendationer på liten ST som har flera DAC:ar, eller om man kan lösa detta via någon SPI funktion som talar med externa DAC:ar eller liknande. Vore kul.
DanielM
Inlägg: 2194
Blev medlem: 5 september 2019, 14:19:58

Re: Förslag på PWM, ADC, I/O och DAC IC kretsar med SPI?

Inlägg av DanielM »

Bara så ni vet det så har jag planer på att ta bort lite PWM och ersätta det med 1 Encoder, 2 stycken capture input, dvs frekvensmätning. Jag tänker använda bättre jordning för PWM och starkare MOSFET samt att jag planerar att implementera ett FTDI-chip på kortet också för att vi lite mera universiell kommunikation. UART är bra, men alla datorer har inte UART.

Sammanfattning för kort V2.0:

- Ta bort 2 PWM och implementera 1 Encoder
- Ta bort 2 PWM och implementera 2 frekvensmätning
- Bättre GND koppling för PWM
- FTDI-chip mellan USB och UART
- Bättre skruvfästen för de 4 raspberry hålen.

Jag lägger upp projektet när det är klart.

:tumupp:
Skriv svar