Fler funtioner i PICcontrollern
Nästa implementerade uppgift för PICen är mätning av matningsspänningar
Övervaka och mäta matningsspänningarna
Krav-1201: Alla huvudmatningsspänningar skall övervakas
Krav-1102: I felloggen skall alla spänningar och temperaturer lagras
Krav-1204: Om strömmen i matningsspänningarna överstiger 20% av vad designen är dimensionerad för skall förstärkaren gå i felläge
Krav-1401: Det skall finnas funktioner som gör att man enkelt ska kunna trimma Potarna så spänningarna mäts korrekt
Krav-1305: Om fel upptäcks under uppstart skall förstärkaren inte startas utan gå i felläge
Det finns ett flertal krav som påverkar lösningen att mäta och övervaka matningsspänningarna. Det finns också några kanske outtalade och ibland underförstådda förväntningar på lösningen, tex. att det skall gå att läsa spänningar i lämpligt klartextformat.
I PICen finns en MUX, en AD och en spänningsreferens som kan kopplas ihop och användas för detta. ADn är 10bitar. Det kan tyckas lite men det kommer fungera bra tror jag. Det finns många spänningar att mäta om man vill men kravet säger huvudmatningsspänningar så det tolkar jag som Högspänningen, den Negativa spänningen samt Glödspänningarna som är uppdelade på fyra olika matningsslingor.
De finns också krav på att mäta strömförbrukningen och det går att göra om man mäter spänningsskillnaden över filtermotstånden mellan glättningskondensatorerna.
Ett begränsande krav är att eftersom mjukvara skrivs i assembler så jag vill ha åstakomma heltal som motsvarar de olika spänningarna i Volt. Jag vill därför ha följande talformat när mätningen är klar.
Till saken hör att PICen strömförsörjs från den negativa matningen så PICens GND ligger -12V under förstärkaren GND. Det ger faktiskt en fördel för då behöver vi inte vända upp den negativa spänningen och dom andra spänningarna kan vi mäta genom att justera offset.
ADn ger 10bitar. Jag sätter Vref till 4,096V för att bäst undertrycka störningar. MUXingångarna är inte så högohmiga så vi behöver dra en viss ström från matningarna för att kunna mäta. Om man inte har låg impedans i källan så rekommenderas en 10n kondensator på ingången som S/H kretsen i PICen kan ladda från inför mätning.
Mätområdena skulle man kunna ”trimma” i mjukvaran men det här är en rörförstärkare och det kommer finnas trimpotar på sina ställen så jag väljer att sätta trimpotar även här på ingångarna till ADn för att minska kraven på ingående delars toleranser.
Högspänningen
Ett 1Mohm motstånd kommer utveckla dryga ¼ W för 512V. Nominell spänning i förstärkaren kommer hålla sig under 290V och där kommer effekten vara 84mW eller lägre så ett 1Mohm känns lämpligt som Rtop i spänningsdelaren.
Med referensen på 4,096V behöver insignalen till ADn vara 4,096V för att ge full scale. Så spänningsdelande resistansen blir
RbottomTot = 4,096 * 1M / (500V + 12V – 4,096V) = 8k064 ohm
Jag har ett mindre lager med 5K cermettrimpotar så varför inte använda dessa och försöka centrera potmittläget mot 8k genom att lyfta potbottenspänningen med ett motstånd till jord
Rbottom = RbottomTot – 5k/2 = 5k6 ohm
ADn är 10 bitar så med denna koppling med 511V (9bitar) som max spänning får vi i LSB biten från ADn halva Volt men det låter vi PICen strippa bort genom att dividera med 2
Readout [V] = ADvalue10b / 2 - 12Voffset8b => 0 - 499V (= 0x000 - 0x1F3)
Glödspänningen
Glödspänningen är centrerad runt förstärkarens nolla. Mäter man på ”plus sidan” så ska den alltså ligga nominellt 6,3V/2 = 3,15V över förstärkarens GND och 3,15V+12V = 15,15V högre än PICens GND.
Ett 8bitars mätområde med 25,5V som max skulle passa bra. Med referensen på 4,096V betyder det att 25,5V => skall spänningdelas till 4,095V = motsvara ADmax 0x3FF. Om vi tänker oss samma ström som i högspänningfallet borde vi få ett motstånd Rtop som är
Rtop = 25,6V * 1M / 512 = 50k => 47k
Då får vi ett Rbottom som
RbottomTot = 4,096V * 47k / (25V5 – 4,096V) = 8k99 ohm
Men en 5k pot med centrerat mittläge får vi ett Rbottom så här
Rbottom = RbottomTot – 5k/2 = 6k8
ADn är 10 bitar så med denna koppling kommer vi mäta 1/20 Volt och 1/40 Volt med dom två lägsta bitarna. Men dom kan enkelt skippas i mjukvaran genom att divdera med 4. Men vi får inte glömma att eftersom glödspänningen svävar runt förstärkares GND så ser vi ju bara halva spänningen. Alltså dividerar vi bara med 2 och får på så sätt vårt talområde i 8 bitar att vara motsvara hela volt med en decimal. Spänningen kommer att bottna vid 12V7 istället för 25V5 men det gör ju inget för vi ska bara mäta upp till max 8V obelastad glödspänning.
Readout [V] = ADvalue10b -12Voffset10b* / 2 => 0 - 12V7 (= 0x00 – 0x7F)
* 12V10b betyder att att värdet 120 representerats i 10bitar => 120*4 = 0x1E0
Praktiska prov visade dock att ett minskat inställningsområde för potarna är önskvärt för glödspänningsingångarna. Efter lite labbande med olika värden ser lösningen ut såhär
NEG spänningen
NEG (den negativa) spänningen är lite speciell. Kopplar man MUXingången för att mäta -12V relativt förstärkarens GND då PICens GND är just -12V så får jag ju inget utslag. Skulle NEG spänningen dessutom vara lägre, låt säga -13V så kommer ADen inte kunna mäta det.
Men om man sätter en spänningsdelare från förstärkarens GND till NEG spänningen och mäter den på så sätt nominellt som -6V vilket betyder +6V från PICens GND så kommer det att funka även om den negativa spänningen drar iväg under PICens GND
Talområdet för NEG spänningen och därmed spänningsdelaren får vara den samma som för glödspänningen men en särskild spänningsdelare införs så att den negativa spänningen mäts som halva av dess spänning.
ADn är 10 bitar så med denna koppling kommer vi även här mäta 1/20 Volt och 1/40 Volt med dom två lägsta bitarna. Men dom kan enkelt skippas i mjukvaran genom att dividera med 4. Men vi får inte glömma att spänningen är dela med två för att kunna mäta negativa spänningar så ser vi bara halva spänningen. Alltså dividerar vi bara med 2 och får på så sätt vårt talområde i 8 bitar att vara motsvara hela volt med en decimal.
Nu när det är en negativ spänning vi mäter så ska vår 12V offset användas omvänt mot för glödspänningsmätningen.
Readout [V] = (12Voffset10b – ADvalue10b) / 2 => -24V0 - 0V (= 0xF0 - 0x00)
Integration och filtrering
ADvalue10b som visats här är egentligen ett filtrerat ADvärde. Vid varje läsning görs en summa med det tidigare värdet och talet delas med två och lagras som ett nytt värde och här används alla 10bitarna för bästa precision.
ADvalue10b = (ADvalue10b + newADresult10b) / 2
Man kan likna det med hur en kondensator integrerar.
Förutom denna filtrering läses newADresult vid jittrande och flytande tidpunkt med intervall mellan 40ms – 250ms för att minimera svävningar som beror av nätfrekvens och avläsningsfrekvensen.
Mätning av ström i högspänningen
Det finns ett krav som säger att om strömmen ökar med 20% över normalt så ska förstärkaren stängas av. Med den föreslagna kopplingen och nätdelens uppbyggnad kan man inte mäta så noggrant.
Tanken var att ta spänningsskillnaden mellan de två första filterkondensatorerna efter likriktningen. Men spänningsskillnaden är för liten och stegen i mA kommer därför bli betydligt större än vad 20% motsvarar. Det här kravet får formuleras om så intentionen fortfarande uppfylls.