Forum: Mikrocontroller und Digitale Elektronik PSMC 3 Phasen Ansteuerung PIC 16F1788


von Marc H. (flashinthegas)


Lesenswert?

Guten Abend,

ich verbringe nun schon das gesamte Wochenende damit, das PSMC-Modul 
meines PIC's zum laufen zu bringen.
Bis jetzt tut sich noch nichts - nichtmal die einzelnen Pins werden auf 
5V geschalten, von PWM ganz zu schweigen.

Selbst das Beispielprogramm aus dem Datenblatt läuft nicht... :(

Hier mein Code zur ansteuerung eines BLDC Motors (nur eine Phase erstmal 
zum testen...)
1
list p=16F1788
2
#include <p16F1788.inc>
3
4
Errorlevel -302
5
org 0x00  ;beginne mit flashadresse 0
6
7
;******************************************************
8
;**********Oszillator Konfiguration********************
9
BANKSEL OSCCON
10
MOVLW B'11111011'   ;intosc auf 32MHz
11
MOVWF OSCCON
12
;************Konfig des PSMC****************************
13
BANKSEL PSMC1CON
14
bsf PSMC1PRS, 0     ;bit 0 setzen für Timermatch als Periodenstart
15
bsf PSMC1PHS, 0     ;bit 0 setzen für Timermatch als high puls start
16
bsf PSMC1DCS, 0     ;bit 0 setzen für Timermatch als low puls (ende high)
17
movlw b'00110001'   ;prescaler auf 8 und 64MHz PLL gewählt
18
movwf PSMC1CLK
19
movlw b'10001111'   ;low Byte vom 16bit PWM Perioden-Register
20
movwf PSMC1PRL
21
movlw b'00000001'   ;high Byte von 16bit PWM Peride
22
movwf PSMC1PRH      ;entspricht 20kHz PWM-Frequenz
23
clrf  PSMC1PHH      ;Highpuls soll bei 0 beginnen
24
clrf  PSMC1PHL      ;high und low byte auf 0
25
movlw b'01100100'   ;dezimal 100, entspricht 25% DutyCycle
26
movwf PSMC1DCL      ;Registerinhalt (Timer) 100 kommt die fallende Flanke bzw. Lowimpuls
27
clrf  PSMC1DCH      ;high byte wird nicht benötigt
28
movlw b'10000000'
29
movwf PSMC1MDL      ;Modulationsquelle etc. WTF?
30
clrf  PSMC1POL      ;aktiv high pegel wählen (5V entspr. log 1)
31
bsf PSMC1INT, 5     ;5. bit enspricht dem DC interrupt (-> für comparator zum auslesen!!)
32
                    ;1. bit vom PSMC1INT abfragen/löschen für kommutierung
33
bsf PSMC1INT, 6     ;Interrupt bei start vom highpegel des PWM
34
;bsf PSMC1STR1, 7    ;PWM synchron zur periode
35
bsf PSMC1STR1, 0    ;highside wird mit pwm beaufschlagt (lowside nicht)
36
movlw b'00111111'
37
movwf PSMC1OEN      ;pins auf PSMC umschalten ...?!
38
movlw b'11001100'   ;PSMC an und auf 3phasen modus + updates der Reg. einschalten
39
movwf PSMC1CON
40
BANKSEL TRISC
41
;       xx-+-+-+
42
;       xxFEDCBA
43
movlw b'11101101'   ;alle Pins die benötigt werden als Output beim PortC
44
movwf TRISC
45
;**********************************************************
46
;****************Ende der Config***************************
47
48
49
movlw 0x10          ;B und E anschalten
50
movwf PSMC1STR0
51
52
Main
53
goto Main
54
55
56
57
delay_2ms           ;31,25ns * 255*255 -> 2ms bei 32Mhz
58
MOVLW 255           ;255 ins Wreg
59
MOVWF 0x20          ;255 in den RAM schreiben
60
loopi
61
call hilf_delay
62
DECFSZ 0x20, 1      ;Inhalt in 0x20 um 1 dekrementieren
63
goto loopi          ;übersprungen wenn 0x20 = 0
64
return
65
66
hilf_delay
67
MOVLW 255           ;20 ins Wreg
68
MOVWF 0x28          ;20 in den RAM schreiben
69
DECFSZ 0x28, 1      ;Inhalt in 0x20 um 1 dekrementieren
70
goto $-1            ;programcursor eine Instruktion zurück; übersprungen wenn 0x20 = 0
71
return
72
73
end

Hat jemand von euch mit dem PSMC-Modul schon gearbeitet und sieht meinen 
Fehler? Vielleicht hab ich eines der 10^36 Register vergessen zu 
befüllen (das vermute ich bis jetzt)...


Post Scriptum: ich habs auch schon mit dem grafischen 
Configurationsprogramm (für das PSMC) probiert... war leider ebenfalls 
ein Schuss in den Ofen.

Gruß

von Marc H. (flashinthegas)


Angehängte Dateien:

Lesenswert?

Habe jetzt mal alle Register, die mit dem PSMC-Modul zu tuen haben, 
überprüft.
Grün habe ich durchgestrichen, was meiner Meinung zum Betrieb nicht 
nötig ist und auch von mir nicht benutzt wird.
Rot durchgestrichen sind die Register, die ich manipuliere und somit 
korrekt benutzt werden (denke ich zumindest).

Das einzige Register, welches übrig bleibt kann ich grade in keinen 
sinnvollen Zusammenhang bringen mit der PSMC Geschichte...

Hat wirklich keiner das MOdul schon zum laufen gebracht?
Geht bei jemandem das Beispielprogramm?


Gruß

PS: hier das Datenblatt 
http://ww1.microchip.com/downloads/en/DeviceDoc/41675A.pdf

auf Seite 289 ist die Registerübersicht.

: Bearbeitet durch User
von Chris B. (dekatz)


Lesenswert?

Mit Motoransteuerung kenne ich mich nicht aus.
Mir fällt nur auf das in allen DB-Beispielen TRISC,0 auf OUTPUT 
geschaltet wird:
z.B. "single phase"
BANKSEL TRISC
BCF TRISC, 0 ; enable pin driver
oder hier "complementary single phase
BANKSEL TRISC
BCF TRISC, 0 ; enable pin drivers
BCF TRISC, 1
oder hier "push pull setup"
BANKSEL TRISC
BCF TRISC, 0 ; enable pin drivers
BCF TRISC, 1

Bei dir ist PORTC,0 auf INPUT geschaltet !?!?

von Marc H. (flashinthegas)


Lesenswert?

Hallo,
danke für deine Antworkt. Wenn du dir den Code nochmal schief anschaust, 
dann erkennst du, dass zwar im Kommentar "PORTC" steht, aber im Opcode 
"TRISC".
1
list p=16F1788
2
#include <p16F1788.inc>
3
4
Errorlevel -302
5
org 0x00  ;beginne mit flashadresse 0
6
7
;******************************************************
8
;**********Oszillator Konfiguration********************
9
BANKSEL OSCCON
10
MOVLW B'11111011'   ;intosc auf 32MHz
11
MOVWF OSCCON
12
13
.
14
.
15
.
16
17
;**********************************************************
18
;****************Ende der Config***************************
19
20
BANKSEL PSMC1STR0   <-----------------------
21
movlw 0x10          ;B und E anschalten
22
movwf PSMC1STR0
23
24
Main
25
goto Main
26
27
28
29
delay_2ms           ;31,25ns * 255*255 -> 2ms bei 32Mhz
30
MOVLW 255           ;255 ins Wreg
31
MOVWF 0x20          ;255 in den RAM schreiben
32
loopi
33
call hilf_delay
34
DECFSZ 0x20, 1      ;Inhalt in 0x20 um 1 dekrementieren
35
goto loopi          ;übersprungen wenn 0x20 = 0
36
return
37
38
hilf_delay
39
MOVLW 255           ;20 ins Wreg
40
MOVWF 0x28          ;20 in den RAM schreiben
41
DECFSZ 0x28, 1      ;Inhalt in 0x20 um 1 dekrementieren
42
goto $-1            ;programcursor eine Instruktion zurück; übersprungen wenn 0x20 = 0
43
return
44
45
end

Hab mal noch ein BANKSEL ergänzt...

von Erich (Gast)


Lesenswert?

Das PSMC Modul ist eine sehr interessante Teil.
Leider habe ich praktisch noch nicht damit gearbeitet.
Aber wenn man in die Doku schaut, da gibt es ein extra Tool um die 
komplexe Initialisierung zu konfigurieren: Der "PSMC Designer"

https://www.microchip.com/pagehandler/en-us/family/8bit/peripherals/coreindependent/psmc-prdpge.html
https://www.microchip.com/pagehandler/en-us/family/8bit/peripherals/coreindependent/psmc-prdpge.html#downloads
https://www.microchip.com/pagehandler/en-us/family/8bit/peripherals/coreindependent/psmc-prdpge.html#documentation

Sowie
http://ww1.microchip.com/downloads/en/DeviceDoc/41671A.pdf
http://ww1.microchip.com/downloads/en/DeviceDoc/00896j.pdf

Und ich denke auch, dieses Bauteil sollte man nicht mehr in Assembler 
befummeln.

Klaus

von Marc H. (flashinthegas)


Lesenswert?

@Erich
Das hab ich im Post Scriptum doch geschrieben. Trotzdem Danke.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Der Thread ist zwar alt, aber der PIC16f1783 immernoch interessant, 
darum:

Hast Du schon eine Antwort erhalten, Marc ?
Bin grade am Experimentieren mit einem PIC16F1783 + PSMC, und stolpere 
über die z.Z. spärliche Beschreibung in AN1468 ...
Da steht zwar viel drin (was der PSMC alles kann), aber ein einfaches 
Codefragment (vorzugsweise für XC8) fehlt leider völlig, und dem 
PSMC-"Designer" kann ich nicht viel abgewinnen.


Besten Gruß,
  Wolfgang .

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.