This commit is contained in:
darren siepka 2018-04-05 21:42:47 +01:00
commit 8583e8ac7a
52 changed files with 29893 additions and 80673 deletions

2
misra/check_misra.sh Executable file → Normal file
View File

@ -4,7 +4,7 @@ fi
for i in speeduino/speeduino/*.ino; do
#cppcheck --xml --include=${i%.*}.h --include=speeduino/speeduino/globals.h $i > /dev/null
cppcheck --dump --suppress=syntaxError:speeduino/speeduino/src/PID_v1/PID_v1.h --include=${i%.*}.h --include=speeduino/speeduino/globals.h $i > /dev/null
cppcheck --force --dump --suppress=syntaxError:speeduino/speeduino/src/PID_v1/PID_v1.h --include=${i%.*}.h --include=speeduino/speeduino/globals.h $i > /dev/null
done
mv speeduino/speeduino/*.dump ./
rm ./utils.*.dump

View File

@ -546,7 +546,7 @@
<constant digits="0" name="vvtFreq" units="Hz">300.0</constant>
<constant digits="0" name="idleFreq" units="Hz">160.0</constant>
<constant name="launchPin">"Board Default"</constant>
<constant name="launchEnable">"Yes"</constant>
<constant name="launchEnable">"No"</constant>
<constant name="launchHiLo">"LOW"</constant>
<constant digits="0" name="lnchSoftLim" units="rpm">2500.0</constant>
<constant digits="0" name="lnchRetard" units="deg">-15.0</constant>
@ -628,9 +628,9 @@
</constant>
<constant cols="1" digits="0" name="iacCrankBins" rows="4" units="C">
-40.0
-40.0
-40.0
-40.0
0.0
40.0
80.0
</constant>
<constant name="iacAlgorithm">"None"</constant>
<constant name="iacStepTime">"1"</constant>
@ -647,9 +647,9 @@
<constant digits="0" name="fanFreq" units="Hz">0.0</constant>
<constant cols="1" digits="0" name="fanPWMBins" rows="4" units="C">
-40.0
-40.0
-40.0
-40.0
0.0
40.0
80.0
</constant>
</page>
<page number="6" size="240">

2153
reference/Calculations.dash Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<msq xmlns="http://www.msefi.com/:msq">
<bibliography author="TunerStudio MS(Beta) 3.0.50.23 - EFI Analytics, Inc." tuneComment="" writeDate="Wed Jan 03 21:35:21 AEDT 2018"/>
<versionInfo fileFormat="5.0" firmwareInfo="Speeduino+2017.12" nPages="10" signature="speeduino 201712"/>
<bibliography author="TunerStudio MS(Beta) 3.0.50.40 - EFI Analytics, Inc." tuneComment="" writeDate="Sat Mar 10 20:55:10 AEDT 2018"/>
<versionInfo fileFormat="5.0" firmwareInfo="Speeduino+2017.12" nPages="10" signature="speeduino 201802"/>
<page>
<pcVariable name="tsCanId">"CAN ID 0"</pcVariable>
</page>
@ -58,12 +58,10 @@
86.0
90.0
96.0
500.0
100.0
</constant>
</page>
<page number="1" size="128">
<constant digits="0" name="flexBoostLow" units="kPa">0.0</constant>
<constant digits="0" name="flexBoostHigh" units="kPa">50.0</constant>
<constant digits="0" name="asePct" units="%">25.0</constant>
<constant digits="0" name="aseCount" units="s">8.0</constant>
<constant cols="1" digits="0" name="wueRates" rows="10" units="%">
@ -137,10 +135,6 @@
<constant digits="0" name="oddfire2" units="deg">0.0</constant>
<constant digits="0" name="oddfire3" units="deg">0.0</constant>
<constant digits="0" name="oddfire4" units="deg">0.0</constant>
<constant digits="0" name="flexFuelLow" units="%">100.0</constant>
<constant digits="0" name="flexFuelHigh" units="%">163.0</constant>
<constant digits="0" name="flexAdvLow" units="Deg">0.0</constant>
<constant digits="0" name="flexAdvHigh" units="Deg">10.0</constant>
<constant digits="0" name="iacCLminDuty" units="%">0.0</constant>
<constant digits="0" name="iacCLmaxDuty" units="%">0.0</constant>
<constant digits="0" name="boostMinDuty" units="%">20.0</constant>
@ -281,15 +275,12 @@
<constant name="fuelPumpPin">"Board Default"</constant>
<constant name="useResync">"No"</constant>
<constant digits="1" name="sparkDur" units="ms">1.0</constant>
<constant digits="1" name="unused4-8" units="ms">25.5</constant>
<constant digits="1" name="unused4-9" units="ms">25.5</constant>
<constant digits="1" name="unused4-10" units="ms">25.5</constant>
<constant digits="0" name="SkipCycles" units="cycles">1.0</constant>
<constant name="unused4-12a">"NOTHING"</constant>
<constant name="useDwellLim">"On"</constant>
<constant name="sparkMode">"Wasted Spark"</constant>
<constant name="TrigFilter">"Off"</constant>
<constant name="ignCranklock">"On"</constant>
<constant name="ignCranklock">"Off"</constant>
<constant digits="1" name="dwellcrank" units="ms">4.5</constant>
<constant digits="1" name="dwellrun" units="ms">3.0</constant>
<constant digits="0" name="numTeeth" units="teeth">36.0</constant>
@ -996,166 +987,53 @@
<constant digits="0" name="boostIntv" units="ms">20.0</constant>
<constant digits="0" name="stagedInjSizePri" units="cc/min">200.0</constant>
<constant digits="0" name="stagedInjSizeSec" units="cc/min">600.0</constant>
<constant cols="1" digits="0" name="unused11_32_192" rows="159" units="RPM">
700.0
25500.0
700.0
700.0
<constant cols="1" digits="0" name="flexBoostBins" rows="6" units="%">
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
700.0
700.0
700.0
700.0
700.0
700.0
0.0
0.0
25500.0
25500.0
20.0
40.0
60.0
80.0
100.0
</constant>
<constant cols="1" digits="0" name="flexBoostAdj" rows="6" units="kPa">
0.0
10.0
20.0
30.0
40.0
50.0
</constant>
<constant cols="1" digits="0" name="flexFuelBins" rows="6" units="%">
0.0
20.0
40.0
60.0
80.0
100.0
</constant>
<constant cols="1" digits="0" name="flexFuelAdj" rows="6" units="%">
100.0
139.0
156.0
160.0
163.0
163.0
</constant>
<constant cols="1" digits="0" name="flexAdvBins" rows="6" units="%">
0.0
20.0
40.0
60.0
80.0
100.0
100.0
100.0
100.0
100.0
100.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
700.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
100.0
0.0
200.0
200.0
100.0
100.0
100.0
200.0
25500.0
25500.0
25500.0
25500.0
0.0
100.0
0.0
100.0
100.0
25500.0
100.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
25500.0
1000.0
5000.0
7500.0
11000.0
15000.0
12000.0
10900.0
9600.0
0.0
1200.0
1000.0
600.0
500.0
1000.0
1000.0
1300.0
1500.0
1500.0
2500.0
3800.0
4500.0
5000.0
6500.0
9000.0
12500.0
21600.0
100.0
3000.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
</constant>
<constant cols="1" digits="0" name="flexAdvAdj" rows="6" units="Deg">
0.0
2.0
5.0
8.0
9.0
10.0
</constant>
<constant digits="0" name="UNALLOCATED_TOP_9" units="RAW">
255.0
@ -1166,6 +1044,7 @@
<setting name="SPEED_DENSITY" value="SPEED_DENSITY"/>
<setting name="CAN_COMMANDS_OFF" value="CAN_COMMANDS_OFF"/>
<setting name="CELSIUS" value="CELSIUS"/>
<setting name="resetcontrol_standard" value="resetcontrol_standard"/>
<setting name="AFR" value="AFR"/>
</settings>
<userComments Comment="These are user comments that can be related to a particular setting or dialog."/>

File diff suppressed because it is too large Load Diff

View File

@ -2,122 +2,37 @@
; THROUGH (PLATED) HOLES START AT T100
M48
INCH
T1C0.033465
T2C0.165354
T3C0.125984
T100C0.038194
T101C0.042000
T102C0.015748
T103C0.040000
T104C0.031496
T105C0.030000
T106C0.038000
T107C0.043302
T108C0.035433
T1C0.165354
T2C0.125984
T3C0.033465
T100C0.015748
T101C0.040000
T102C0.031496
T103C0.030000
T104C0.038000
T105C0.043302
T106C0.035433
T107C0.038194
T108C0.042000
%
T1
X018002Y017668
X016821Y017668
T2
X001895Y003148
X030651Y013731
X001895Y036497
X001895Y018448
X030651Y022829
T3
X037661Y012030
T2
X035411Y030780
X037661Y012030
T3
X018002Y017668
X016821Y017668
T100
X037911Y022780
X012911Y011780
X036911Y014780
X021911Y011780
X021911Y030780
X037911Y018780
X030911Y011780
X015311Y030780
X030911Y030780
X036911Y029780
X037911Y021780
X036911Y013780
X015911Y011780
X037911Y017780
X024911Y011780
X009311Y030780
X024911Y030780
X036911Y028780
X033911Y011780
X037911Y020780
X033911Y030780
X037911Y016780
X010311Y030780
X018911Y030780
X036911Y027780
X027911Y030780
X010911Y011780
X036911Y030780
X037911Y015780
X036911Y026780
X013311Y030780
X037911Y014780
X013911Y011780
X022911Y011780
X036911Y025780
X007311Y030780
X022911Y030780
X031911Y011780
X016311Y030780
X037911Y029780
X031911Y030780
X037911Y013780
X016911Y011780
X036911Y024780
X025911Y011780
X037911Y028780
X034911Y011780
X036911Y023780
X019911Y011780
X011311Y030780
X019911Y030780
X037911Y027780
X028911Y011780
X036911Y019780
X028911Y030780
X037911Y030780
X036911Y022780
X011911Y011780
X020911Y011780
X020911Y030780
X037911Y026780
X036911Y018780
X014311Y030780
X036911Y021780
X014911Y011780
X037911Y025780
X008311Y030780
X023911Y011780
X036911Y017780
X023911Y030780
X032911Y011780
X032911Y030780
X036911Y020780
X037911Y024780
X017911Y011780
X036911Y016780
X017911Y030780
X026911Y011780
X026911Y030780
X035911Y011780
X037911Y023780
X036911Y015780
X012311Y030780
X037911Y019780
X029911Y011780
X029911Y030780
T101
X023681Y004280
X026661Y004280
T102
X006411Y035280
X024911Y028530
X012161Y002280
X014661Y015280
X015911Y009780
X007161Y006030
X003661Y002280
X029161Y013780
@ -127,8 +42,8 @@ X026661Y016280
X022161Y006280
X018911Y029780
X017161Y033030
X018411Y015030
X027911Y029780
X018411Y015030
X015161Y002280
X035661Y031780
X002161Y026030
@ -147,7 +62,6 @@ X002161Y021530
X005161Y011280
X035911Y018530
X007411Y012530
X006661Y028780
X001911Y033030
X008911Y017530
X028161Y020530
@ -156,8 +70,8 @@ X031661Y004280
X029014Y005516
X018661Y028530
X007411Y034030
X005911Y004280
X009411Y009280
X005911Y004280
X011661Y017530
X035661Y008030
X028661Y020530
@ -182,8 +96,8 @@ X034911Y033030
X034911Y034280
X009411Y010280
X003411Y004280
X008411Y032530
X014161Y003030
X008411Y032530
X023161Y035780
X033911Y005030
X016911Y005530
@ -198,8 +112,8 @@ X013411Y007280
X026911Y009530
X029661Y020530
X013911Y006030
X011161Y028780
X035661Y004280
X011161Y028780
X019161Y008780
X017661Y018030
X025411Y030280
@ -208,22 +122,19 @@ X035161Y018280
X030911Y020030
X019161Y007780
X017911Y010530
X006411Y035280
X024911Y028530
X012161Y002280
X014661Y015280
X015911Y009780
T103
T101
X025927Y018780
X025927Y019780
X025927Y016780
X025927Y020780
X025927Y017780
X025927Y015779
X025927Y018780
T104
X022161Y004780
T102
X022161Y007733
T105
X022161Y004780
T103
X030906Y028285
X027906Y033285
X031906Y028285
X028906Y033285
X029906Y028285
@ -238,9 +149,12 @@ X033906Y033285
X026906Y033285
X027906Y028285
X028906Y028285
X030906Y028285
X027906Y033285
T106
T104
X019911Y026280
X010911Y022280
X015911Y020280
X013911Y023280
X018911Y021280
X011911Y026280
X022911Y023280
X016911Y024280
@ -320,8 +234,8 @@ X012911Y023280
X017911Y021280
X023911Y020280
X010911Y026280
X015911Y024280
X021911Y023280
X015911Y024280
X018911Y025280
X037911Y032030
X012911Y022280
@ -348,12 +262,8 @@ X018911Y022280
X013911Y024280
X016911Y025280
X022911Y024280
X019911Y026280
X010911Y022280
X015911Y020280
X013911Y023280
X018911Y021280
T107
T105
X004141Y030535
X005911Y005140
X005911Y011281
X005911Y028172
@ -386,8 +296,8 @@ X005911Y006515
X004141Y029356
X005911Y021047
X004141Y007740
X005911Y024631
X004141Y026989
X005911Y024631
X004141Y031756
X004141Y023447
X004141Y013644
@ -401,11 +311,100 @@ X005911Y017223
X004141Y006515
X004141Y021047
X004141Y024631
X004141Y030535
T108
T106
X037661Y004480
X037661Y007280
X037661Y011030
X037661Y008230
X037661Y004480
T107
X012311Y030780
X037911Y019780
X029911Y011780
X029911Y030780
X037911Y022780
X012911Y011780
X036911Y014780
X021911Y011780
X021911Y030780
X037911Y018780
X030911Y011780
X015311Y030780
X030911Y030780
X036911Y029780
X037911Y021780
X036911Y013780
X015911Y011780
X037911Y017780
X024911Y011780
X009311Y030780
X024911Y030780
X036911Y028780
X033911Y011780
X037911Y020780
X033911Y030780
X037911Y016780
X010311Y030780
X018911Y030780
X036911Y027780
X027911Y030780
X010911Y011780
X036911Y030780
X037911Y015780
X036911Y026780
X013311Y030780
X037911Y014780
X013911Y011780
X022911Y011780
X036911Y025780
X007311Y030780
X022911Y030780
X031911Y011780
X016311Y030780
X037911Y029780
X031911Y030780
X037911Y013780
X016911Y011780
X036911Y024780
X025911Y011780
X037911Y028780
X034911Y011780
X036911Y023780
X019911Y011780
X011311Y030780
X019911Y030780
X037911Y027780
X028911Y011780
X036911Y019780
X028911Y030780
X037911Y030780
X036911Y022780
X011911Y011780
X020911Y011780
X020911Y030780
X037911Y026780
X036911Y018780
X014311Y030780
X036911Y021780
X014911Y011780
X037911Y025780
X023911Y011780
X036911Y017780
X008311Y030780
X023911Y030780
X032911Y011780
X032911Y030780
X036911Y020780
X037911Y024780
X017911Y011780
X036911Y016780
X017911Y030780
X026911Y011780
X026911Y030780
X035911Y011780
X037911Y023780
X036911Y015780
T108
X026661Y004280
X023681Y004280
T00
M30

View File

@ -259,7 +259,6 @@ X1716Y3303D03*
X2316Y3578D03*
X3591Y1853D03*
X2341Y1453D03*
X666Y2878D03*
X1591Y978D03*
X1441Y878D03*
X1341Y728D03*

View File

@ -278,7 +278,6 @@ X1716Y3303D03*
X2316Y3578D03*
X3591Y1853D03*
X2341Y1453D03*
X666Y2878D03*
X1591Y978D03*
X1441Y878D03*
X1341Y728D03*

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 487 KiB

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 645 KiB

After

Width:  |  Height:  |  Size: 654 KiB

View File

@ -7,87 +7,117 @@ T101C0.038194
T102C0.015748
%
T100
X002021Y015166
X019021Y014166
X009021Y009166
X001021Y015166
X003021Y015166
X005021Y015166
X007021Y015166
X004021Y015166
X006021Y015166
X008021Y015166
X012021Y009166
X010021Y009166
X009021Y015166
X019021Y012166
X017021Y009166
X015021Y009166
X013021Y009166
X011021Y009166
X018021Y009166
X016021Y009166
X014021Y009166
X010021Y015166
X012021Y015166
X007021Y003416
X005021Y003416
X003021Y003416
X019021Y009166
X011021Y015166
X013021Y015166
X015021Y015166
X017021Y015166
X006021Y003416
X004021Y003416
X019021Y010166
X014021Y015166
X016021Y015166
X018021Y015166
X024021Y009166
X022021Y009166
X020021Y009166
X019021Y015166
X023021Y009166
X021021Y009166
X024021Y009166
X020021Y015166
X022021Y015166
X021021Y015166
X023021Y015166
X019021Y013166
X020021Y015166
X022021Y015166
X024021Y015166
X019021Y011166
X002021Y009166
X007021Y009166
X005021Y009166
X003021Y009166
X001021Y009166
X008021Y009166
X006021Y009166
X004021Y009166
X002021Y009166
X019021Y014166
X009021Y009166
X007021Y009166
X001021Y015166
X003021Y015166
X005021Y015166
X002021Y015166
X004021Y015166
X006021Y015166
X008021Y015166
X007021Y015166
X009021Y015166
X019021Y012166
X015021Y009166
X013021Y009166
X011021Y009166
X018021Y009166
X016021Y009166
X014021Y009166
X012021Y009166
X010021Y009166
X005021Y003416
X003021Y003416
X019021Y009166
X017021Y009166
X011021Y015166
X013021Y015166
X015021Y015166
X006021Y003416
X004021Y003416
X019021Y010166
X010021Y015166
X012021Y015166
X014021Y015166
X016021Y015166
X018021Y015166
X007021Y003416
X017021Y015166
X019021Y015166
X023021Y009166
X021021Y009166
T101
X038021Y004916
X037021Y015916
X029021Y019916
X038021Y019916
X014021Y000916
X038021Y003916
X021021Y019916
X037021Y014916
X023021Y000916
X030021Y019916
X032021Y000916
X012421Y019916
X038021Y018916
X038021Y002916
X017021Y000916
X037021Y013916
X024021Y019916
X026021Y000916
X038021Y017916
X037021Y009916
X033021Y019916
X015421Y019916
X035021Y000916
X037021Y012916
X018021Y019916
X027021Y019916
X029021Y000916
X038021Y016916
X009421Y019916
X037021Y008916
X037021Y011916
X012021Y000916
X021021Y000916
X038021Y015916
X037021Y007916
X010421Y019916
X030021Y000916
X010421Y019916
X037021Y010916
X015021Y000916
X038021Y014916
X022021Y019916
X038021Y014916
X024021Y000916
X037021Y006916
X031021Y019916
X013421Y019916
X033021Y000916
X038021Y013916
X018021Y000916
X037021Y005916
X018021Y000916
X025021Y019916
X007421Y019916
X027021Y000916
X007421Y019916
X034021Y019916
X038021Y009916
X016421Y019916
@ -113,83 +143,53 @@ X016021Y000916
X023021Y019916
X038021Y006916
X025021Y000916
X032021Y019916
X037021Y017916
X034021Y000916
X032021Y019916
X014421Y019916
X034021Y000916
X038021Y005916
X008421Y019916
X037021Y016916
X008421Y019916
X011021Y000916
X038021Y004916
X020021Y000916
X037021Y015916
X029021Y019916
X038021Y019916
X014021Y000916
X038021Y003916
X021021Y019916
X023021Y000916
X037021Y014916
X030021Y019916
X032021Y000916
X012421Y019916
X038021Y018916
X038021Y002916
X017021Y000916
X037021Y013916
X024021Y019916
X026021Y000916
X038021Y017916
X033021Y019916
X015421Y019916
X037021Y009916
X035021Y000916
X037021Y012916
X018021Y019916
X029021Y000916
X038021Y016916
X027021Y019916
X009421Y019916
X037021Y008916
T102
X024021Y009916
X038521Y001166
X014521Y005166
X032021Y008666
X014521Y001666
X030521Y007666
X019271Y004166
X014521Y003166
X034771Y011916
X014521Y004666
X032021Y012666
X024271Y004166
X022271Y004166
X020271Y004166
X037021Y001166
X025271Y004166
X023271Y004166
X021271Y004166
X018771Y004666
X014521Y002666
X026271Y004166
X021646Y010666
X009271Y002916
X014521Y002666
X018771Y000916
X005771Y011666
X009271Y002916
X014021Y004916
X014521Y004166
X009271Y001166
X005771Y011666
X014021Y004916
X028521Y012416
X014521Y002166
X028271Y008666
X017271Y004666
X018021Y004666
X030771Y004666
X014521Y003666
X030521Y009666
X016521Y000416
X014521Y002166
X027771Y004166
X014521Y003666
X024021Y009916
X038521Y001166
X032021Y008666
X030521Y007666
X014521Y005166
X014521Y001666
X034771Y011916
X019271Y004166
X014521Y003166
X032021Y012666
X020271Y004166
X014521Y004666
X025271Y004166
X023271Y004166
X021271Y004166
X018771Y004666
X026271Y004166
X024271Y004166
X022271Y004166
T00
M30

View File

@ -4,7 +4,7 @@
*eMail=
*
*Project=Teensy 3.5 Adaptor
*Date=23:00:50
*Date=14:20:27
*CreatedBy=Fritzing 0.9.3b.04.19.5c895d327c44a3114e5fcc9d8260daf0cbb52806
*
*
@ -13,472 +13,454 @@
*Rotation in degree (0-360, math. pos.)
*
*No;Value;Package;X;Y;Rotation;Side;Name
1;;;90.5138;-45.3247;0;Bottom;TXT19
2;;;37.0349;-47.6956;-90;Bottom;TXT19
3;;;56.5691;-10.5834;0;Bottom;Via16
4;;;95.3008;-51.5337;0;Bottom;Copper Fill163
5;;;98.6693;-25.2846;0;Bottom;TXT19
6;;;51.4891;-10.5834;0;Bottom;Via13
7;;;66.6877;-11.0969;0;Bottom;Copper Fill151
8;;;54.6608;-51.4575;0;Bottom;Copper Fill15
9;;;90.5138;-22.3761;0;Bottom;TXT19
10;;;69.4944;-5.6105;0;Bottom;Copper Fill275
11;;;49.0474;-20.6219;0;Bottom;Copper Fill245
12;;;36.8841;-5.50335;0;Bottom;Via9
13;;;12.7381;-9.5729;0;Bottom;Copper Fill283
14;;so014;67.3642;-31.1634;0;Top;IC1
15;;;6.6294;-19.0471;0;Bottom;Copper Fill68
16;;;47.9806;-21.1807;0;Bottom;Copper Fill238
17;;;70.4977;-11.0969;0;Bottom;Copper Fill332
18;;;95.3262;-41.7039;0;Bottom;Copper Fill188
19;;;78.5368;-11.9224;0;Bottom;Copper Fill120
20;;;47.6791;-11.8534;0;Bottom;Via39
21;;;88.3191;-30.2684;0;Bottom;Via32
22;;;45.4406;-36.7255;0;Bottom;Copper Fill213
23;;;54.5084;-27.1624;0;Bottom;Copper Fill108
24;;;95.3262;-41.7039;0;Bottom;Copper Fill38
25;;;72.8218;-31.582;0;Bottom;Copper Fill143
26;;;26.7208;-24.2541;0;Bottom;Copper Fill60
27;;;21.844;-40.8403;0;Bottom;Copper Fill187
28;;;90.5138;-29.9718;0;Bottom;TXT19
29;;;77.4573;-25.0669;0;Bottom;Copper Fill298
30;;;23.5077;-7.0329;0;Bottom;Copper Fill103
31;;;34.3408;-24.2541;0;Bottom;Copper Fill63
32;;;96.5073;-6.6519;0;Bottom;Copper Fill139
33;;;89.9456;-7.11828;0;Bottom;TXT19
34;;;49.5808;-51.4575;0;Bottom;Copper Fill13
35;;;53.7718;-33.9823;0;Bottom;Copper Fill202
36;;;95.3262;-21.3839;0;Bottom;Copper Fill239
37;;;72.3773;-32.0265;0;Bottom;Copper Fill141
38;;;47.4218;-30.9724;0;Bottom;Copper Fill136
39;;;69.9008;-51.4575;0;Bottom;Copper Fill19
40;;;70.4977;-10.2079;0;Bottom;Copper Fill333
41;;;22.6568;-51.4575;0;Bottom;Copper Fill3
42;;;23.9268;-7.452;0;Bottom;Copper Fill105
43;;;98.6693;-30.2596;0;Bottom;TXT19
44;180k;0805 [SMD];57.8391;-6.38318;90;Top;R7
45;;;2.5781;-22.5015;0;Bottom;Copper Fill314
46;;;55.3212;-17.0659;0;Bottom;Copper Fill252
47;;;36.8808;-37.4875;0;Bottom;Copper Fill197
48;;;47.2694;-47.3935;0;Bottom;Copper Fill31
49;180k;0805 [SMD];55.2991;-6.38318;90;Top;R5
50;;;95.3262;-29.0039;0;Bottom;Copper Fill47
51;;;95.3262;-46.7839;0;Bottom;Copper Fill36
52;;;54.5084;-27.1624;0;Bottom;Copper Fill292
53;;;87.8332;-30.312;0;Bottom;Copper Fill100
54;;;61.2569;-45.8965;-90;Bottom;TXT19
55;;;23.5491;-7.40835;0;Bottom;Via30
56;;;46.4566;-33.6267;0;Bottom;Copper Fill222
57;;;95.3262;-39.1639;0;Bottom;Copper Fill194
58;;;49.0982;-30.9724;0;Bottom;Copper Fill321
59;;;19.3294;-41.1705;0;Bottom;Copper Fill186
60;;;46.5328;-21.5109;0;Bottom;Copper Fill243
61;;;98.6693;-35.3396;0;Bottom;TXT19
62;;;95.3262;-34.0839;0;Bottom;Copper Fill221
63;;;95.3262;-23.9239;0;Bottom;Copper Fill236
64;330k;0805 [SMD];55.2992;-14.0032;-90;Top;R6
65;;;90.7097;-50.4047;0;Bottom;TXT19
66;;;48.0568;-2.372;0;Bottom;Copper Fill158
67;;;72.4408;-51.4575;0;Bottom;Copper Fill20
68;;;43.7896;-47.9269;0;Bottom;Copper Fill11
69;;;90.5138;-27.4882;0;Bottom;TXT19
70;;;64.1096;-24.2541;0;Bottom;Copper Fill230
71;;;95.3262;-34.0839;0;Bottom;Copper Fill45
72;;;64.1477;-10.2079;0;Bottom;Copper Fill329
73;;;95.3262;-16.3039;0;Bottom;Copper Fill255
74;;;69.215;-31.8741;0;Bottom;Copper Fill224
75;;;77.0128;-24.6224;0;Bottom;Copper Fill116
76;;;39.751;-33.4489;0;Bottom;Copper Fill70
77;;;27.9908;-30.9089;0;Bottom;Copper Fill41
78;;THT;12.7542;-8.67826;-90;Bottom;J4
79;;;97.8441;-2.96335;0;Bottom;Via27
80;;;19.3469;-1.27133;0;Bottom;TXT18
81;;;59.0804;-6.3979;0;Bottom;Copper Fill272
82;;;51.4477;-10.2079;0;Bottom;Copper Fill324
83;;;26.4033;-51.4575;0;Bottom;Copper Fill138
84;;;78.1177;-11.4779;0;Bottom;Copper Fill118
85;;;10.4066;-5.05384;-90;Bottom;TXT20
86;;;90.5138;-19.8406;0;Bottom;TXT19
87;;;88.2777;-29.8929;0;Bottom;Copper Fill99
88;;;56.5404;-6.3979;0;Bottom;Copper Fill271
89;;;50.8964;-26.4583;0;Bottom;Part1
90;;;55.372;-27.1624;0;Bottom;Copper Fill109
91;;;95.3262;-46.7839;0;Bottom;Copper Fill175
92;;;59.1091;-10.5834;0;Bottom;Via17
93;;THT;31.8042;-38.5233;90;Bottom;J2
94;;;50.9524;-36.5223;0;Bottom;Copper Fill200
95;;;64.1891;-10.5834;0;Bottom;Via19
96;;;5.334;-35.6079;0;Bottom;Copper Fill207
97;;;88.2777;-29.8929;0;Bottom;Copper Fill285
98;;;34.7726;-22.2221;0;Bottom;Copper Fill77
99;180k;0805 [SMD];65.4591;-6.38318;90;Top;R13
100;180k;0805 [SMD];67.9991;-6.38318;90;Top;R15
101;;;55.372;-27.1624;0;Bottom;Copper Fill293
102;;;90.5256;-21.8157;0;Bottom;Copper Fill78
103;;;90.5138;-42.6718;0;Bottom;TXT19
104;;;78.5368;-11.9224;0;Bottom;Copper Fill305
105;;;57.2008;-51.4575;0;Bottom;Copper Fill16
106;;;32.6898;-45.7933;0;Bottom;Copper Fill27
107;;;88.6968;-30.312;0;Bottom;Copper Fill101
108;;;95.631;-15.8467;0;Bottom;Copper Fill85
109;;;77.0128;-24.6224;0;Bottom;Copper Fill300
110;;;55.118;-11.4525;0;Bottom;Copper Fill261
111;;;42.0678;-47.9743;-90;Bottom;TXT19
112;;;9.1694;-19.3773;0;Bottom;Copper Fill69
113;;;11.4808;-24.2541;0;Bottom;Copper Fill54
114;;;57.658;-11.4525;0;Bottom;Copper Fill262
115;;;95.631;-13.2813;0;Bottom;Copper Fill88
116;;;94.4118;-3.0324;0;Bottom;Copper Fill338
117;;;91.1606;-17.3707;0;Bottom;Copper Fill84
118;;;19.304;-20.3425;0;Bottom;Copper Fill71
119;;;23.9268;-3.0324;0;Bottom;Copper Fill131
120;;;35.179;-46.1489;0;Bottom;Copper Fill28
121;;;70.9168;-10.6524;0;Bottom;Copper Fill334
122;;;39.8526;-5.0517;0;Bottom;Copper Fill280
123;;;95.3262;-49.3239;0;Bottom;Copper Fill35
124;;;95.3262;-26.4639;0;Bottom;Copper Fill235
125;;;59.0677;-11.0969;0;Bottom;Copper Fill153
126;;;21.6408;-24.2541;0;Bottom;Copper Fill58
127;;;95.3262;-31.5439;0;Bottom;Copper Fill46
128;;;79.8576;-26.8195;0;Bottom;Copper Fill217
129;;;36.8841;-9.31335;0;Bottom;Via36
130;;;98.6693;-27.7761;0;Bottom;TXT19
131;;;2.5781;-24.1779;0;Bottom;Copper Fill313
132;;;77.0128;-19.5424;0;Bottom;Copper Fill307
133;;;77.0128;-19.5424;0;Bottom;Copper Fill123
134;;;95.3262;-11.2239;0;Bottom;Copper Fill259
135;;;77.4573;-25.0669;0;Bottom;Copper Fill114
136;;;16.5608;-24.2541;0;Bottom;Copper Fill56
137;;;65.278;-11.4525;0;Bottom;Copper Fill265
138;;;23.5077;-3.4769;0;Bottom;Copper Fill129
139;;;71.8091;-22.0134;0;Bottom;Via1
140;;;7.8994;-35.9127;0;Bottom;Copper Fill208
141;;;54.9529;-27.6069;0;Bottom;Copper Fill106
142;;;4.5466;-30.9089;0;Bottom;Copper Fill44
143;330k;0805 [SMD];62.9192;-14.0032;-90;Top;R12
144;;;81.1784;-19.4027;0;Bottom;Copper Fill247
145;;;35.3568;-51.4575;0;Bottom;Copper Fill8
146;;;90.5138;-40.1318;0;Bottom;TXT19
147;;;95.631;-26.0067;0;Bottom;Copper Fill49
148;;;52.578;-11.4525;0;Bottom;Copper Fill260
149;;;81.3341;-32.1734;0;Bottom;Via12
150;;;83.6168;-26.5401;0;Bottom;Copper Fill229
151;;;98.6693;-22.6639;0;Bottom;TXT19
152;;;26.7621;-47.0408;-90;Bottom;TXT19
153;;;81.7118;-32.2424;0;Bottom;Copper Fill150
154;;;36.8046;-24.2541;0;Bottom;Copper Fill64
155;;;12.7381;-7.8965;0;Bottom;Copper Fill284
156;;;41.9641;-1.05835;0;Bottom;Via38
157;;;75.3618;-26.7941;0;Bottom;Copper Fill219
158;;;23.5077;-7.0329;0;Bottom;Copper Fill287
159;;;90.5138;-17.3096;0;Bottom;TXT19
160;;;56.5277;-11.0969;0;Bottom;Copper Fill146
161;;;97.7773;-2.5879;0;Bottom;Copper Fill111
162;;;93.9673;-6.6519;0;Bottom;Copper Fill134
163;;;89.5858;-25.6511;0;Bottom;Copper Fill50
164;;;72.4441;-31.5384;0;Bottom;Via11
165;;;37.8968;-51.4575;0;Bottom;Copper Fill9
166;;;62.2808;-33.0171;0;Bottom;Copper Fill215
167;;;7.91792;-5.74702;-90;Bottom;TXT20
168;;;77.851;-36.9541;0;Bottom;Copper Fill203
169;;;78.232;-48.9175;0;Bottom;Copper Fill170
170;;;12.7478;-10.7894;0;Bottom;TXT21
171;;;56.3085;-48.0494;-90;Bottom;TXT19
172;;;14.0208;-24.2541;0;Bottom;Copper Fill55
173;;;25.1968;-51.4575;0;Bottom;Copper Fill4
174;;;84.3165;-47.7896;-90;Bottom;TXT19
175;;;38.608;-10.1825;0;Bottom;Copper Fill268
176;;;34.3408;-37.4875;0;Bottom;Copper Fill196
177;;;94.4118;-3.0324;0;Bottom;Copper Fill161
178;;;21.844;-20.6473;0;Bottom;Copper Fill72
179;;;90.5138;-12.2296;0;Bottom;TXT19
180;;;41.8973;-0.7083;0;Bottom;Copper Fill282
181;;;93.9673;-3.4769;0;Bottom;Copper Fill337
182;;;77.4573;-19.9869;0;Bottom;Copper Fill121
183;;;95.3262;-8.6839;0;Bottom;Copper Fill276
184;;;72.3773;-31.1629;0;Bottom;Copper Fill142
185;;;77.9018;-19.5424;0;Bottom;Copper Fill124
186;;;95.3262;-29.0039;0;Bottom;Copper Fill227
187;;;30.2768;-51.4575;0;Bottom;Copper Fill6
188;;;92.5322;-45.3107;0;Bottom;Copper Fill178
189;;;47.6377;-2.8165;0;Bottom;Copper Fill335
190;;;26.924;-21.2823;0;Bottom;Copper Fill74
191;;;80.6196;-25.0161;0;Bottom;Copper Fill233
192;;;98.6693;-40.4196;0;Bottom;TXT19
193;;;58.8485;-48.0494;-90;Bottom;TXT19
194;;;90.8304;-19.9107;0;Bottom;Copper Fill82
195;;;37.7444;-46.4537;0;Bottom;Copper Fill29
196;;;81.3341;-22.0134;0;Bottom;Via2
197;;;95.3262;-31.5439;0;Bottom;Copper Fill225
198;;;19.1008;-24.2541;0;Bottom;Copper Fill57
199;;;48.9491;-10.5834;0;Bottom;Via14
200;;;32.1564;-39.5703;0;Bottom;Copper Fill193
201;;;77.4573;-19.0979;0;Bottom;Copper Fill122
202;;;46.736;-36.0905;0;Bottom;Copper Fill216
203;;THT;31.8042;-23.2833;-90;Bottom;J1
204;;;60.198;-11.4525;0;Bottom;Copper Fill263
205;;;78.1177;-12.3669;0;Bottom;Copper Fill302
206;;;95.3262;-18.8439;0;Bottom;Copper Fill250
207;;;97.3074;-7.452;0;Bottom;Copper Fill140
208;;;50.1904;-20.0631;0;Bottom;Copper Fill246
209;;;98.7625;-9.94614;0;Bottom;TXT19
210;330k;0805 [SMD];65.4592;-14.0032;-90;Top;R14
211;;;93.9673;-2.5879;0;Bottom;Copper Fill160
212;;;23.0632;-3.0324;0;Bottom;Copper Fill130
213;;;98.6693;-20.1284;0;Bottom;TXT19
214;;;77.4573;-24.1779;0;Bottom;Copper Fill115
215;;;97.7773;-2.5879;0;Bottom;Copper Fill295
216;;;77.5241;-24.5534;0;Bottom;Via25
217;;;38.2778;-11.4271;0;Bottom;Copper Fill267
218;;;43.7388;-50.6955;0;Bottom;Copper Fill165
219;;;82.042;-25.0415;0;Bottom;Copper Fill234
220;;;95.3262;-36.6239;0;Bottom;Copper Fill206
221;;;32.8168;-51.4575;0;Bottom;Copper Fill7
222;;;98.6693;-32.7432;0;Bottom;TXT19
223;;;61.341;-33.4489;0;Bottom;Copper Fill214
224;;;95.3262;-39.1639;0;Bottom;Copper Fill40
225;;;59.7408;-51.4575;0;Bottom;Copper Fill17
226;;THT;48.3142;-30.9033;0;Bottom;J3
227;;;78.1591;-11.8534;0;Bottom;Via24
228;;;77.9018;-24.6224;0;Bottom;Copper Fill301
229;;;95.3262;-11.2239;0;Bottom;Copper Fill90
230;;;98.6693;-45.6125;0;Bottom;TXT19
231;;;51.0286;-19.5043;0;Bottom;Copper Fill248
232;;;98.6693;-42.9596;0;Bottom;TXT19
233;;;39.243;-7.6425;0;Bottom;Copper Fill278
234;;;61.6712;-11.5541;0;Bottom;Copper Fill87
235;;;76.708;-36.1667;0;Bottom;Copper Fill205
236;;;16.1544;-42.0849;0;Bottom;Copper Fill184
237;;;70.4977;-11.0969;0;Bottom;Copper Fill155
238;;;65.5574;-16.2531;0;Bottom;Copper Fill257
239;;;63.8813;-45.8494;-90;Bottom;TXT19
240;;;45.7741;-11.8534;0;Bottom;Via22
241;;;66.6877;-10.2079;0;Bottom;Copper Fill328
242;;;66.0908;-50.6955;0;Bottom;Copper Fill166
243;;;97.3074;-7.452;0;Bottom;Copper Fill323
244;;;96.5073;-6.6519;0;Bottom;Copper Fill322
245;180k;0805 [SMD];50.2191;-6.38318;90;Top;R1
246;;;81.2673;-32.6869;0;Bottom;Copper Fill147
247;;;5.715;-13.7131;0;Bottom;Copper Fill67
248;;;64.1477;-11.0969;0;Bottom;Copper Fill152
249;;;54.9529;-27.6069;0;Bottom;Copper Fill290
250;;;20.1168;-51.4575;0;Bottom;Copper Fill2
251;;;61.6491;-10.5834;0;Bottom;Via18
252;;;61.0141;-25.1884;0;Bottom;Via37
253;;;71.1962;-27.8101;0;Bottom;Copper Fill228
254;330k;0805 [SMD];60.3792;-14.0032;-90;Top;R10
255;;;24.4094;-40.5355;0;Bottom;Copper Fill189
256;;;36.8841;-8.04335;0;Bottom;Via6
257;;;39.1922;-37.4875;0;Bottom;Copper Fill198
258;;;74.1;-47.7896;-90;Bottom;TXT19
259;;;2.5781;-24.1779;0;Bottom;Copper Fill132
260;;;8.9408;-24.2541;0;Bottom;Copper Fill53
261;;;16.1798;-15.6435;0;Bottom;Copper Fill244
262;;;82.6008;-51.4575;0;Bottom;Copper Fill24
263;;;93.1672;-7.452;0;Bottom;Copper Fill320
264;;;61.6077;-11.0969;0;Bottom;Copper Fill154
265;;;88.2777;-30.7565;0;Bottom;Copper Fill98
266;;;41.8973;-0.7083;0;Bottom;Copper Fill95
267;;;95.3262;-8.6839;0;Bottom;Copper Fill92
268;;;29.2608;-24.2541;0;Bottom;Copper Fill61
269;;;62.738;-11.4525;0;Bottom;Copper Fill264
270;;;59.6138;-22.2475;0;Bottom;Copper Fill237
271;;;32.004;-21.9173;0;Bottom;Copper Fill76
272;;;13.6144;-42.7199;0;Bottom;Copper Fill179
273;;;98.5765;-37.8796;0;Bottom;TXT19
274;;;47.0408;-51.4575;0;Bottom;Copper Fill12
275;;;46.1296;-48.0494;-90;Bottom;TXT19
276;;;36.8841;-10.5834;0;Bottom;Via5
277;;;14.859;-42.3897;0;Bottom;Copper Fill181
278;;;36.8841;-6.77335;0;Bottom;Via8
279;;;52.5018;-35.2523;0;Bottom;Copper Fill201
280;;;45.8216;-32.3821;0;Bottom;Copper Fill223
281;;;86.8;-47.7896;-90;Bottom;TXT19
282;;;79.18;-47.7896;-90;Bottom;TXT19
283;;;29.464;-21.6125;0;Bottom;Copper Fill75
284;;;73.4568;-31.3407;0;Bottom;Copper Fill226
285;;;49.0982;-30.9724;0;Bottom;Copper Fill137
286;;;14.6177;-30.1469;0;Bottom;Copper Fill125
287;;;23.0632;-7.452;0;Bottom;Copper Fill104
288;;;64.1604;-6.3979;0;Bottom;Copper Fill274
289;;;24.892;-37.4621;0;Bottom;Copper Fill212
290;;;14.6177;-29.2579;0;Bottom;Copper Fill126
291;;;81.72;-47.7896;-90;Bottom;TXT19
292;;;95.3262;-13.7639;0;Bottom;Copper Fill258
293;;;95.3262;-44.2439;0;Bottom;Copper Fill37
294;;;95.3008;-51.4575;0;Bottom;Copper Fill26
295;;;71.4471;-47.7896;-90;Bottom;TXT19
296;;;36.8841;-13.1234;0;Bottom;Via3
297;;;14.1732;-29.7024;0;Bottom;Copper Fill311
298;;;54.0004;-6.3979;0;Bottom;Copper Fill270
299;;;47.6791;-2.32835;0;Bottom;Via31
300;;;54.9816;-27.0934;0;Bottom;Via28
301;;;84.6582;-35.2015;0;Bottom;Copper Fill220
302;;;62.103;-24.0001;0;Bottom;Copper Fill51
303;;;91.567;-43.7359;0;Bottom;Copper Fill180
304;;;9.779;-43.6597;0;Bottom;Copper Fill174
305;;;36.3466;-5.74226;0;Bottom;TXT5
306;;;53.9877;-11.0969;0;Bottom;Copper Fill145
307;;;78.867;-33.0425;0;Bottom;Copper Fill80
308;;;14.6177;-30.1469;0;Bottom;Copper Fill309
309;;;89.7128;-27.0989;0;Bottom;Copper Fill48
310;;;26.924;-40.2053;0;Bottom;Copper Fill190
311;;;98.2218;-3.0324;0;Bottom;Copper Fill113
312;;;11.0744;-43.3549;0;Bottom;Copper Fill176
313;;;23.5077;-7.8965;0;Bottom;Copper Fill286
314;;;52.1208;-51.4575;0;Bottom;Copper Fill14
315;;;77.6732;-11.9224;0;Bottom;Copper Fill304
316;;;80.8228;-32.2424;0;Bottom;Copper Fill149
317;;;77.9018;-24.6224;0;Bottom;Copper Fill117
318;;;15.0368;-29.7024;0;Bottom;Copper Fill312
319;;;98.6693;-15.0261;0;Bottom;TXT19
320;;;5.334;-44.2947;0;Bottom;Copper Fill172
321;;;80.0608;-51.4575;0;Bottom;Copper Fill23
322;;;67.818;-11.4525;0;Bottom;Copper Fill266
323;;;39.5478;-6.3217;0;Bottom;Copper Fill279
324;;;95.3262;-44.2439;0;Bottom;Copper Fill183
325;;;77.5208;-51.4575;0;Bottom;Copper Fill22
326;;;81.2673;-31.7979;0;Bottom;Copper Fill148
327;;;59.944;-48.9937;0;Bottom;Copper Fill33
328;;;97.3328;-3.0324;0;Bottom;Copper Fill112
329;;;91.5162;-14.8815;0;Bottom;Copper Fill86
330;;;36.8841;-4.23335;0;Bottom;Via10
331;;;42.5704;-37.1573;0;Bottom;Copper Fill199
332;;;48.3955;-3.62757;0;Bottom;TXT19
333;;;98.2218;-3.0324;0;Bottom;Copper Fill297
334;;;39.4903;-47.9272;-90;Bottom;TXT19
335;;;2.5781;-22.5015;0;Bottom;Copper Fill133
336;;;23.5077;-7.8965;0;Bottom;Copper Fill102
337;;;74.9808;-51.4575;0;Bottom;Copper Fill21
338;;;75.3872;-48.9429;0;Bottom;Copper Fill169
339;;;10.5156;-45.6917;0;Bottom;Copper Fill164
340;;;29.9084;-30.0886;0;Bottom;IMG1
341;;;54.0291;-10.5834;0;Bottom;Via15
342;;;17.399;-41.7547;0;Bottom;Copper Fill185
343;;;34.6235;-9.47286;0;Bottom;TXT3
344;;;81.1022;-37.8685;0;Bottom;Copper Fill182
345;;;49.8094;-47.7237;0;Bottom;Copper Fill32
346;;;34.4949;-47.6956;-90;Bottom;TXT19
347;;;70.2818;-25.0415;0;Bottom;Copper Fill232
348;;;61.6077;-10.2079;0;Bottom;Copper Fill331
349;;;62.2808;-51.4575;0;Bottom;Copper Fill18
350;;;77.9018;-19.5424;0;Bottom;Copper Fill308
351;;;61.6204;-6.3979;0;Bottom;Copper Fill273
352;;;15.0368;-29.7024;0;Bottom;Copper Fill128
353;;;31.9549;-47.6956;-90;Bottom;TXT19
354;;;45.0088;-21.5871;0;Bottom;Copper Fill242
355;;;77.5241;-19.4734;0;Bottom;Via23
356;;;23.9268;-3.0324;0;Bottom;Copper Fill318
357;;;14.6177;-29.2579;0;Bottom;Copper Fill310
358;;;64.6684;-35.3539;0;Bottom;Copper Fill192
359;;;95.3262;-36.6239;0;Bottom;Copper Fill43
360;;;43.4086;-15.0339;0;Bottom;Copper Fill253
361;;;90.5138;-14.7383;0;Bottom;TXT19
362;;;53.9877;-10.2079;0;Bottom;Copper Fill326
363;;;38.0873;-37.7415;0;Bottom;Copper Fill135
364;;;92.456;-11.0461;0;Bottom;Copper Fill91
365;;;98.6693;-17.5975;0;Bottom;TXT19
366;;;74.4474;-34.5919;0;Bottom;Copper Fill218
367;330k;0805 [SMD];57.8392;-14.0032;-90;Top;R8
368;;;98.6693;-48.0586;0;Bottom;TXT19
369;;;48.9077;-10.2079;0;Bottom;Copper Fill325
370;;;59.0677;-10.2079;0;Bottom;Copper Fill330
371;;;90.5138;-35.0518;0;Bottom;TXT19
372;;;70.9676;-18.1835;0;Bottom;Copper Fill79
373;;;51.4477;-11.0969;0;Bottom;Copper Fill144
374;;;23.5077;-3.4769;0;Bottom;Copper Fill316
375;;;54.9529;-26.7179;0;Bottom;Copper Fill107
376;;;43.8691;-11.8534;0;Bottom;Via21
377;;;12.319;-43.0247;0;Bottom;Copper Fill177
378;;;14.1732;-29.7024;0;Bottom;Copper Fill127
379;;;56.7182;-39.5957;0;Bottom;Copper Fill39
380;;;1.6256;-45.4377;0;Bottom;Copper Fill162
381;;;63.0936;-16.5579;0;Bottom;Copper Fill256
382;;;51.4604;-6.3979;0;Bottom;Copper Fill269
383;;;23.5491;-2.96335;0;Bottom;Via29
1;;;77.851;-36.9541;0;Bottom;Copper Fill184
2;;;95.3262;-18.8439;0;Bottom;Copper Fill231
3;;;36.8046;-24.2541;0;Bottom;Copper Fill48
4;;;76.64;-47.7896;-90;Bottom;TXT19
5;;;43.7388;-50.6955;0;Bottom;Copper Fill146
6;;;29.464;-21.6125;0;Bottom;Copper Fill59
7;180k;0805 [SMD];60.3791;-6.38318;90;Top;R9
8;;;12.7381;-9.5729;0;Bottom;Copper Fill79
9;;;92.5322;-45.3107;0;Bottom;Copper Fill159
10;;;90.5138;-32.4553;0;Bottom;TXT19
11;;;13.6144;-42.7199;0;Bottom;Copper Fill160
12;;;54.9816;-27.0934;0;Bottom;Via28
13;;;94.4118;-3.0324;0;Bottom;Copper Fill142
14;;;21.6408;-24.2541;0;Bottom;Copper Fill42
15;330k;0805 [SMD];50.2192;-14.0032;-90;Top;R2
16;;THT;12.7542;-8.67826;-90;Bottom;J4
17;;THT;48.3142;-30.9033;0;Bottom;J3
18;;;39.4903;-47.9272;-90;Bottom;TXT19
19;;;61.6712;-11.5541;0;Bottom;Copper Fill70
20;;;26.7208;-24.2541;0;Bottom;Copper Fill44
21;;;54.5084;-27.1624;0;Bottom;Copper Fill273
22;;;71.4471;-47.7896;-90;Bottom;TXT19
23;;;70.9168;-10.6524;0;Bottom;Copper Fill137
24;;;4.5466;-30.9089;0;Bottom;Copper Fill26
25;;;56.7182;-39.5957;0;Bottom;Copper Fill21
26;;;62.5094;-49.2985;0;Bottom;Copper Fill14
27;;;91.1606;-17.3707;0;Bottom;Copper Fill67
28;;;78.9178;-32.9663;0;Bottom;Copper Fill64
29;;;56.3085;-48.0494;-90;Bottom;TXT19
30;;;26.854;-17.4709;0;Bottom;TXT18
31;;;70.9676;-18.1835;0;Bottom;Copper Fill63
32;;;42.0678;-47.9743;-90;Bottom;TXT19
33;;;10.4066;-5.05384;-90;Bottom;TXT20
34;;;90.2208;-23.1111;0;Bottom;Copper Fill50
35;;;35.179;-46.1489;0;Bottom;Copper Fill8
36;;;93.9673;-3.4769;0;Bottom;Copper Fill318
37;;;98.5765;-37.8796;0;Bottom;TXT19
38;;;54.0004;-6.3979;0;Bottom;Copper Fill251
39;;;90.5256;-21.8157;0;Bottom;Copper Fill62
40;;;98.6693;-20.1284;0;Bottom;TXT19
41;;;48.0568;-2.372;0;Bottom;Copper Fill317
42;;;90.5138;-14.7383;0;Bottom;TXT19
43;;;23.5077;-7.0329;0;Bottom;Copper Fill268
44;;;74.1;-47.7896;-90;Bottom;TXT19
45;;;52.578;-11.4525;0;Bottom;Copper Fill241
46;;;15.494;-36.8779;0;Bottom;Copper Fill192
47;;;58.8485;-48.0494;-90;Bottom;TXT19
48;;;98.7625;-12.5175;0;Bottom;TXT19
49;;;78.5368;-11.9224;0;Bottom;Copper Fill103
50;;;26.924;-21.2823;0;Bottom;Copper Fill58
51;;;43.5356;-22.1205;0;Bottom;Copper Fill222
52;;;98.6693;-27.7761;0;Bottom;TXT19
53;;;12.7381;-7.8965;0;Bottom;Copper Fill265
54;;;90.5138;-35.0518;0;Bottom;TXT19
55;;;26.4033;-51.4575;0;Bottom;Copper Fill121
56;;;90.5138;-47.7707;0;Bottom;TXT19
57;;;64.1096;-24.2541;0;Bottom;Copper Fill211
58;180k;0805 [SMD];55.2991;-6.38318;90;Top;R5
59;180k;0805 [SMD];65.4591;-6.38318;90;Top;R13
60;330k;0805 [SMD];60.3792;-14.0032;-90;Top;R10
61;;;81.3341;-22.0134;0;Bottom;Via2
62;;;6.6294;-19.0471;0;Bottom;Copper Fill52
63;;;95.631;-23.4413;0;Bottom;Copper Fill49
64;;;73.1266;-49.2985;0;Bottom;Copper Fill149
65;;;77.0128;-19.5424;0;Bottom;Copper Fill106
66;;;98.6693;-42.9596;0;Bottom;TXT19
67;;;95.3262;-34.0839;0;Bottom;Copper Fill202
68;;;46.1296;-48.0494;-90;Bottom;TXT19
69;;;25.1968;-51.4575;0;Bottom;Copper Fill4
70;;;8.9408;-24.2541;0;Bottom;Copper Fill37
71;;;61.6077;-11.0969;0;Bottom;Copper Fill135
72;;;37.7444;-46.4537;0;Bottom;Copper Fill9
73;;;81.1784;-19.4027;0;Bottom;Copper Fill228
74;;;98.6693;-15.0261;0;Bottom;TXT19
75;;;34.4949;-47.6956;-90;Bottom;TXT19
76;;;24.4094;-40.5355;0;Bottom;Copper Fill170
77;;;12.9587;-5.04509;-90;Bottom;TXT20
78;;;48.0568;-2.372;0;Bottom;Copper Fill139
79;;;69.0011;-47.7896;-90;Bottom;TXT19
80;;;98.6693;-22.6639;0;Bottom;TXT19
81;;;54.9529;-27.6069;0;Bottom;Copper Fill89
82;;;19.1008;-24.2541;0;Bottom;Copper Fill41
83;;;56.5404;-6.3979;0;Bottom;Copper Fill252
84;;;95.3262;-34.0839;0;Bottom;Copper Fill27
85;;;70.4977;-11.0969;0;Bottom;Copper Fill313
86;;;23.5077;-7.0329;0;Bottom;Copper Fill86
87;;;82.042;-25.0415;0;Bottom;Copper Fill215
88;;;69.4944;-5.6105;0;Bottom;Copper Fill256
89;;;76.708;-36.1667;0;Bottom;Copper Fill186
90;;;95.3262;-44.2439;0;Bottom;Copper Fill18
91;;;71.8091;-22.0134;0;Bottom;Via1
92;;;72.8218;-31.582;0;Bottom;Copper Fill124
93;;;39.8526;-5.0517;0;Bottom;Copper Fill261
94;;;95.3262;-36.6239;0;Bottom;Copper Fill187
95;;;16.1544;-42.0849;0;Bottom;Copper Fill165
96;330k;0805 [SMD];52.7592;-14.0032;-90;Top;R4
97;;;21.844;-45.4377;0;Bottom;Copper Fill1
98;;;95.3262;-13.7639;0;Bottom;Copper Fill239
99;;;2.5781;-22.5015;0;Bottom;Copper Fill295
100;;;37.0349;-47.6956;-90;Bottom;TXT19
101;;;95.3262;-29.0039;0;Bottom;Copper Fill208
102;;;95.3262;-46.7839;0;Bottom;Copper Fill156
103;;;47.9806;-21.1807;0;Bottom;Copper Fill219
104;;;54.9529;-27.6069;0;Bottom;Copper Fill271
105;;;75.3618;-26.7941;0;Bottom;Copper Fill200
106;;;95.3008;-51.5337;0;Bottom;Copper Fill144
107;;;81.7118;-32.2424;0;Bottom;Copper Fill131
108;;;34.7726;-22.2221;0;Bottom;Copper Fill61
109;;;95.3262;-26.4639;0;Bottom;Copper Fill216
110;;;95.3262;-44.2439;0;Bottom;Copper Fill164
111;;;92.456;-11.0461;0;Bottom;Copper Fill74
112;;;11.4808;-24.2541;0;Bottom;Copper Fill38
113;;;98.6693;-35.3396;0;Bottom;TXT19
114;;;61.0141;-25.1884;0;Bottom;Via37
115;180k;0805 [SMD];50.2191;-6.38318;90;Top;R1
116;;;80.6196;-25.0161;0;Bottom;Copper Fill214
117;;;59.0804;-6.3979;0;Bottom;Copper Fill253
118;;;31.8008;-24.2541;0;Bottom;Copper Fill46
119;;;49.8094;-47.7237;0;Bottom;Copper Fill12
120;;;96.5073;-6.6519;0;Bottom;Copper Fill303
121;;;12.7478;-10.7894;0;Bottom;TXT21
122;;;88.2777;-30.7565;0;Bottom;Copper Fill81
123;;;95.3262;-39.1639;0;Bottom;Copper Fill22
124;;;98.6693;-45.6125;0;Bottom;TXT19
125;;;77.9018;-19.5424;0;Bottom;Copper Fill289
126;;;25.9334;-12.0113;0;Bottom;Copper Fill262
127;;;37.6317;-7.61951;0;Bottom;TXT6
128;;;70.4977;-10.2079;0;Bottom;Copper Fill314
129;;;70.9168;-10.6524;0;Bottom;Copper Fill315
130;;;23.0632;-3.0324;0;Bottom;Copper Fill113
131;;;12.9794;-36.5477;0;Bottom;Copper Fill191
132;;;72.4441;-31.5384;0;Bottom;Via11
133;;;77.5241;-24.5534;0;Bottom;Via25
134;;;40.2844;-46.7585;0;Bottom;Copper Fill10
135;;;90.5138;-17.3096;0;Bottom;TXT19
136;;;60.198;-11.4525;0;Bottom;Copper Fill244
137;;;57.658;-11.4525;0;Bottom;Copper Fill243
138;;;95.3262;-49.3239;0;Bottom;Copper Fill15
139;;;93.9673;-6.6519;0;Bottom;Copper Fill300
140;;;56.5277;-10.2079;0;Bottom;Copper Fill308
141;180k;0805 [SMD];62.9191;-6.38318;90;Top;R11
142;;;51.4477;-11.0969;0;Bottom;Copper Fill125
143;;;14.1732;-29.7024;0;Bottom;Copper Fill292
144;;;14.859;-42.3897;0;Bottom;Copper Fill162
145;;;97.3328;-3.0324;0;Bottom;Copper Fill95
146;;;74.4474;-34.5919;0;Bottom;Copper Fill199
147;;;90.5138;-37.5918;0;Bottom;TXT19
148;;;24.1808;-24.2541;0;Bottom;Copper Fill43
149;;;51.4891;-10.5834;0;Bottom;Via13
150;;;78.1591;-11.8534;0;Bottom;Via24
151;;;5.334;-44.2947;0;Bottom;Copper Fill153
152;;;56.5691;-10.5834;0;Bottom;Via16
153;;;97.7773;-3.4769;0;Bottom;Copper Fill275
154;;;42.5704;-37.1573;0;Bottom;Copper Fill180
155;;;41.8973;-0.7083;0;Bottom;Copper Fill263
156;;;54.9529;-26.7179;0;Bottom;Copper Fill272
157;;;19.304;-20.3425;0;Bottom;Copper Fill55
158;;;59.0677;-11.0969;0;Bottom;Copper Fill134
159;;;36.8841;-9.31335;0;Bottom;Via36
160;;;52.5018;-35.2523;0;Bottom;Copper Fill182
161;;;45.7741;-11.8534;0;Bottom;Via22
162;;;14.6177;-30.1469;0;Bottom;Copper Fill290
163;;;78.1177;-11.4779;0;Bottom;Copper Fill101
164;;;94.4118;-3.0324;0;Bottom;Copper Fill319
165;;;24.4348;-30.9089;0;Bottom;Copper Fill176
166;;;48.9491;-10.5834;0;Bottom;Via14
167;;;23.9268;-7.452;0;Bottom;Copper Fill88
168;;;80.8228;-32.2424;0;Bottom;Copper Fill130
169;;;23.0632;-7.452;0;Bottom;Copper Fill87
170;;;77.9018;-24.6224;0;Bottom;Copper Fill282
171;;;2.5781;-24.1779;0;Bottom;Copper Fill115
172;;;21.844;-40.8403;0;Bottom;Copper Fill168
173;;;36.3466;-5.74226;0;Bottom;TXT5
174;;;15.4755;-5.53168;-90;Bottom;TXT20
175;;;90.5138;-12.2296;0;Bottom;TXT19
176;;;39.243;-7.6425;0;Bottom;Copper Fill259
177;;;65.278;-11.4525;0;Bottom;Copper Fill246
178;;;59.944;-48.9937;0;Bottom;Copper Fill13
179;;;53.9877;-11.0969;0;Bottom;Copper Fill126
180;;;23.9268;-3.0324;0;Bottom;Copper Fill299
181;;;59.0677;-10.2079;0;Bottom;Copper Fill311
182;;;2.5781;-22.5015;0;Bottom;Copper Fill116
183;;;97.9424;-31.4423;0;Bottom;Copper Fill28
184;;;38.9128;-8.8617;0;Bottom;Copper Fill258
185;;;23.0632;-3.0324;0;Bottom;Copper Fill298
186;;;95.3262;-41.7039;0;Bottom;Copper Fill169
187;;;48.3955;-3.62757;0;Bottom;TXT19
188;;;81.2673;-32.6869;0;Bottom;Copper Fill128
189;;;88.2777;-29.8929;0;Bottom;Copper Fill82
190;;;5.334;-35.6079;0;Bottom;Copper Fill188
191;;;95.3262;-23.9239;0;Bottom;Copper Fill217
192;;;90.7097;-50.4047;0;Bottom;TXT19
193;;;69.4182;-23.6953;0;Bottom;Copper Fill212
194;;;24.4094;-20.9521;0;Bottom;Copper Fill57
195;330k;0805 [SMD];62.9192;-14.0032;-90;Top;R12
196;;;34.3408;-37.4875;0;Bottom;Copper Fill177
197;;;86.8;-47.7896;-90;Bottom;TXT19
198;;;49.0982;-30.9724;0;Bottom;Copper Fill302
199;;;97.5614;-25.8289;0;Bottom;Copper Fill31
200;;;23.9268;-3.0324;0;Bottom;Copper Fill114
201;;;95.631;-26.0067;0;Bottom;Copper Fill33
202;;;46.736;-36.0905;0;Bottom;Copper Fill197
203;;;78.5368;-11.9224;0;Bottom;Copper Fill286
204;;;47.6791;-11.8534;0;Bottom;Via39
205;;;94.0341;-2.96335;0;Bottom;Via26
206;;;53.7718;-33.9823;0;Bottom;Copper Fill183
207;;;32.004;-21.9173;0;Bottom;Copper Fill60
208;;;77.6732;-11.9224;0;Bottom;Copper Fill285
209;;;98.6693;-25.2846;0;Bottom;TXT19
210;;;95.631;-18.3613;0;Bottom;Copper Fill66
211;;;49.0474;-20.6219;0;Bottom;Copper Fill226
212;;;45.0088;-21.5871;0;Bottom;Copper Fill223
213;;;81.3341;-32.1734;0;Bottom;Via12
214;;;90.5138;-40.1318;0;Bottom;TXT19
215;;;9.1694;-19.3773;0;Bottom;Copper Fill53
216;;;55.3974;-30.9089;0;Bottom;Copper Fill24
217;;;95.3262;-49.2223;0;Bottom;Copper Fill148
218;;;95.3262;-21.3839;0;Bottom;Copper Fill220
219;;;37.0078;-17.8787;0;Bottom;Copper Fill221
220;;;77.4573;-24.1779;0;Bottom;Copper Fill98
221;180k;0805 [SMD];52.7591;-6.38318;90;Top;R3
222;;;95.3262;-36.6239;0;Bottom;Copper Fill25
223;;;39.1922;-37.4875;0;Bottom;Copper Fill179
224;;;61.2569;-45.8965;-90;Bottom;TXT19
225;;;7.8994;-35.9127;0;Bottom;Copper Fill189
226;;;81.1022;-37.8685;0;Bottom;Copper Fill163
227;;;9.779;-43.6597;0;Bottom;Copper Fill155
228;;;14.6177;-29.2579;0;Bottom;Copper Fill291
229;;;55.7276;-29.4357;0;Bottom;Copper Fill185
230;;;23.5077;-7.8965;0;Bottom;Copper Fill85
231;;;90.5138;-42.6718;0;Bottom;TXT19
232;;;22.6568;-51.4575;0;Bottom;Copper Fill3
233;;;58.0644;-17.2183;0;Bottom;Copper Fill232
234;;;29.4149;-47.6956;-90;Bottom;TXT19
235;;;67.818;-11.4525;0;Bottom;Copper Fill247
236;;;55.372;-27.1624;0;Bottom;Copper Fill274
237;;;29.6418;-45.4885;0;Bottom;Copper Fill16
238;;so014;81.3342;-31.1634;0;Top;IC2
239;;;93.1672;-7.452;0;Bottom;Copper Fill301
240;;;87.8332;-30.312;0;Bottom;Copper Fill83
241;;;95.631;-15.8467;0;Bottom;Copper Fill68
242;;;23.9268;-7.452;0;Bottom;Copper Fill270
243;;;90.5138;-9.65828;0;Bottom;TXT19
244;;;66.0908;-50.6955;0;Bottom;Copper Fill147
245;;;21.844;-20.6473;0;Bottom;Copper Fill56
246;;;97.3328;-3.0324;0;Bottom;Copper Fill277
247;;;23.5491;-2.96335;0;Bottom;Via29
248;;;11.0744;-43.3549;0;Bottom;Copper Fill157
249;;;56.5277;-11.0969;0;Bottom;Copper Fill127
250;;;89.5858;-25.6511;0;Bottom;Copper Fill34
251;;;14.0208;-24.2541;0;Bottom;Copper Fill39
252;;;90.5138;-29.9718;0;Bottom;TXT19
253;;so014;67.3642;-31.1634;0;Top;IC1
254;;;64.1477;-10.2079;0;Bottom;Copper Fill310
255;;;43.7896;-47.8507;0;Bottom;Copper Fill5
256;;;81.72;-47.7896;-90;Bottom;TXT19
257;;;49.0982;-30.9724;0;Bottom;Copper Fill118
258;;;97.5614;-42.5421;0;Bottom;Copper Fill6
259;;;36.8841;-4.23335;0;Bottom;Via10
260;;;66.6877;-11.0969;0;Bottom;Copper Fill132
261;;;77.9018;-24.6224;0;Bottom;Copper Fill100
262;;;53.9877;-10.2079;0;Bottom;Copper Fill307
263;;;77.5241;-19.4734;0;Bottom;Via23
264;;;97.7773;-2.5879;0;Bottom;Copper Fill94
265;;;73.4568;-31.3407;0;Bottom;Copper Fill207
266;;;4.191;-2.6133;0;Bottom;Copper Fill76
267;;;77.4573;-19.9869;0;Bottom;Copper Fill287
268;;;48.9077;-10.2079;0;Bottom;Copper Fill306
269;;;14.1732;-29.7024;0;Bottom;Copper Fill110
270;;;91.7956;-12.9511;0;Bottom;Copper Fill72
271;;;20.1168;-51.4575;0;Bottom;Copper Fill2
272;;;77.4573;-24.1779;0;Bottom;Copper Fill280
273;;;50.1904;-20.0631;0;Bottom;Copper Fill227
274;;;64.1604;-6.3979;0;Bottom;Copper Fill255
275;;;77.0128;-19.5424;0;Bottom;Copper Fill288
276;;;70.5391;-10.5834;0;Bottom;Via34
277;;;45.8216;-32.3821;0;Bottom;Copper Fill204
278;;;79.18;-47.7896;-90;Bottom;TXT19
279;;;14.6591;-29.6334;0;Bottom;Via35
280;;;38.2778;-11.4271;0;Bottom;Copper Fill248
281;;;24.892;-37.4621;0;Bottom;Copper Fill193
282;;;1.6256;-45.4377;0;Bottom;Copper Fill143
283;;;91.5162;-14.8815;0;Bottom;Copper Fill69
284;;;36.8841;-6.77335;0;Bottom;Via8
285;;;55.3212;-17.0659;0;Bottom;Copper Fill233
286;;;36.8841;-13.1234;0;Bottom;Via3
287;;;95.3262;-31.5439;0;Bottom;Copper Fill206
288;;;95.3262;-11.2239;0;Bottom;Copper Fill73
289;;;23.5077;-3.4769;0;Bottom;Copper Fill297
290;;;95.3262;-29.0039;0;Bottom;Copper Fill30
291;;;16.5608;-24.2541;0;Bottom;Copper Fill40
292;;;95.631;-13.2813;0;Bottom;Copper Fill71
293;;;54.5084;-27.1624;0;Bottom;Copper Fill91
294;330k;0805 [SMD];65.4592;-14.0032;-90;Top;R14
295;;;12.319;-43.0247;0;Bottom;Copper Fill158
296;;;23.5491;-7.40835;0;Bottom;Via30
297;;;63.8813;-45.8494;-90;Bottom;TXT19
298;;;81.2673;-31.7979;0;Bottom;Copper Fill129
299;180k;0805 [SMD];67.9991;-6.38318;90;Top;R15
300;;;90.5138;-27.4882;0;Bottom;TXT19
301;;;61.6077;-10.2079;0;Bottom;Copper Fill312
302;;;77.6732;-11.9224;0;Bottom;Copper Fill102
303;;;32.1564;-39.5703;0;Bottom;Copper Fill174
304;;;70.4977;-11.0969;0;Bottom;Copper Fill136
305;;;51.4477;-10.2079;0;Bottom;Copper Fill305
306;;;78.1177;-12.3669;0;Bottom;Copper Fill283
307;;;36.8841;-5.50335;0;Bottom;Via9
308;;;19.3294;-41.1705;0;Bottom;Copper Fill167
309;;;47.0662;-39.8751;0;Bottom;Copper Fill20
310;;;64.1891;-10.5834;0;Bottom;Via19
311;;;47.6791;-2.32835;0;Bottom;Via31
312;;;69.215;-31.8741;0;Bottom;Copper Fill205
313;;;98.6693;-30.2596;0;Bottom;TXT19
314;;;90.5138;-24.9968;0;Bottom;TXT19
315;;;27.8531;-27.0933;0;Bottom;TXT18
316;;;73.9493;-5.40915;-90;Bottom;TXT19
317;;;23.5077;-3.4769;0;Bottom;Copper Fill112
318;;;26.7621;-47.0408;-90;Bottom;TXT19
319;;;64.1477;-11.0969;0;Bottom;Copper Fill133
320;;;29.2608;-24.2541;0;Bottom;Copper Fill45
321;;;75.3872;-48.9429;0;Bottom;Copper Fill150
322;;THT;31.8042;-23.2833;-90;Bottom;J1
323;;;43.4086;-15.0339;0;Bottom;Copper Fill234
324;330k;0805 [SMD];67.9992;-14.0032;-90;Top;R16
325;;;53.4924;-11.3001;0;Bottom;Copper Fill77
326;;;60.5536;-16.8627;0;Bottom;Copper Fill235
327;;;36.8808;-37.4875;0;Bottom;Copper Fill178
328;;;89.8906;-24.3557;0;Bottom;Copper Fill36
329;;;36.8841;-8.04335;0;Bottom;Via6
330;;;78.1177;-11.4779;0;Bottom;Copper Fill284
331;;;39.751;-33.4489;0;Bottom;Copper Fill54
332;;;62.103;-24.0001;0;Bottom;Copper Fill35
333;;;88.2777;-29.8929;0;Bottom;Copper Fill266
334;;;46.5328;-21.5109;0;Bottom;Copper Fill224
335;;;72.3773;-31.1629;0;Bottom;Copper Fill123
336;;;84.3165;-47.7896;-90;Bottom;TXT19
337;;;63.0936;-16.5579;0;Bottom;Copper Fill237
338;;;70.2818;-25.0415;0;Bottom;Copper Fill213
339;;;97.3074;-7.452;0;Bottom;Copper Fill120
340;;;98.6693;-17.5975;0;Bottom;TXT19
341;;;98.6693;-40.4196;0;Bottom;TXT19
342;;;14.6177;-29.2579;0;Bottom;Copper Fill109
343;;;98.6693;-48.0586;0;Bottom;TXT19
344;;;50.9524;-36.5223;0;Bottom;Copper Fill181
345;;;72.3773;-32.0265;0;Bottom;Copper Fill122
346;;;98.2218;-3.0324;0;Bottom;Copper Fill96
347;;;91.567;-43.7359;0;Bottom;Copper Fill161
348;;;47.6377;-1.9529;0;Bottom;Copper Fill138
349;;;90.5138;-22.3761;0;Bottom;TXT19
350;;;77.9018;-19.5424;0;Bottom;Copper Fill107
351;;;77.4573;-25.0669;0;Bottom;Copper Fill97
352;;;86.1568;-49.2477;0;Bottom;Copper Fill152
353;;;90.5138;-19.8406;0;Bottom;TXT19
354;;;17.399;-41.7547;0;Bottom;Copper Fill166
355;180k;0805 [SMD];57.8391;-6.38318;90;Top;R7
356;;;46.4566;-33.6267;0;Bottom;Copper Fill203
357;;;95.3262;-16.3039;0;Bottom;Copper Fill236
358;;;89.9456;-7.11828;0;Bottom;TXT19
359;;;41.8973;-0.7083;0;Bottom;Copper Fill78
360;;;47.6377;-2.8165;0;Bottom;Copper Fill316
361;;;59.1091;-10.5834;0;Bottom;Via17
362;;;27.9942;-29.9155;0;Bottom;TXT18
363;;;90.8304;-19.9107;0;Bottom;Copper Fill65
364;;;77.0128;-24.6224;0;Bottom;Copper Fill99
365;;;88.6968;-30.312;0;Bottom;Copper Fill84
366;;;84.6582;-35.2015;0;Bottom;Copper Fill201
367;;;34.6235;-9.47286;0;Bottom;TXT3
368;;;95.3262;-8.6839;0;Bottom;Copper Fill75
369;;;93.9673;-3.4769;0;Bottom;Copper Fill140
370;;;16.1798;-15.6435;0;Bottom;Copper Fill225
371;;;14.6177;-30.1469;0;Bottom;Copper Fill108
372;;;98.7625;-9.94614;0;Bottom;TXT19
373;;;45.4406;-36.7255;0;Bottom;Copper Fill194
374;;;77.4573;-25.0669;0;Bottom;Copper Fill279
375;;;59.6138;-22.2475;0;Bottom;Copper Fill218
376;;;79.8576;-26.8195;0;Bottom;Copper Fill198
377;;;95.3262;-39.1639;0;Bottom;Copper Fill175
378;;;93.9673;-6.6519;0;Bottom;Copper Fill117
379;;;64.6684;-35.3539;0;Bottom;Copper Fill173
380;;;26.924;-40.2053;0;Bottom;Copper Fill171
381;;;98.2218;-3.0324;0;Bottom;Copper Fill278
382;;;15.0368;-29.7024;0;Bottom;Copper Fill293
383;;;61.6491;-10.5834;0;Bottom;Via18
384;;;51.2285;-48.0494;-90;Bottom;TXT19
385;;;31.8008;-24.2541;0;Bottom;Copper Fill62
386;;;24.1808;-24.2541;0;Bottom;Copper Fill59
387;;;97.3328;-3.0324;0;Bottom;Copper Fill296
388;;;93.9673;-3.4769;0;Bottom;Copper Fill159
389;;;56.5277;-10.2079;0;Bottom;Copper Fill327
390;;;73.9493;-5.40915;-90;Bottom;TXT19
391;;;70.9168;-10.6524;0;Bottom;Copper Fill156
392;;;12.9794;-36.5477;0;Bottom;Copper Fill210
393;;;29.4894;-39.9005;0;Bottom;Copper Fill191
394;;;37.0078;-17.8787;0;Bottom;Copper Fill240
395;;;25.9334;-12.0113;0;Bottom;Copper Fill281
396;;;38.9128;-8.8617;0;Bottom;Copper Fill277
397;;;4.191;-2.6133;0;Bottom;Copper Fill93
398;;;91.7956;-12.9511;0;Bottom;Copper Fill89
399;;;53.4924;-26.5401;0;Bottom;Copper Fill94
400;;;95.631;-23.4413;0;Bottom;Copper Fill65
385;;;23.5077;-7.8965;0;Bottom;Copper Fill267
386;;;1.7272;-23.3524;0;Bottom;Copper Fill296
387;;;62.738;-11.4525;0;Bottom;Copper Fill245
388;;;7.91792;-5.74702;-90;Bottom;TXT20
389;;;5.715;-13.7131;0;Bottom;Copper Fill51
390;;;36.8841;-10.5834;0;Bottom;Via5
391;;THT;31.8042;-38.5233;90;Bottom;J2
392;;;15.0368;-29.7024;0;Bottom;Copper Fill111
393;;;55.372;-27.1624;0;Bottom;Copper Fill92
394;;;38.608;-10.1825;0;Bottom;Copper Fill249
395;;;95.3262;-8.6839;0;Bottom;Copper Fill257
396;;;12.7381;-9.5729;0;Bottom;Copper Fill264
397;;;97.7773;-2.5879;0;Bottom;Copper Fill276
398;;;36.8841;-11.8534;0;Bottom;Via4
399;;;96.5073;-6.6519;0;Bottom;Copper Fill119
400;;;97.3074;-7.452;0;Bottom;Copper Fill304
401;;;53.7685;-48.0494;-90;Bottom;TXT19
402;;;35.6141;-12.4884;0;Bottom;Via7
403;;;66.7291;-10.5834;0;Bottom;Via20
404;;;69.4182;-23.6953;0;Bottom;Copper Fill231
405;;;27.7368;-51.4575;0;Bottom;Copper Fill5
406;;;78.1177;-11.4779;0;Bottom;Copper Fill303
407;;;90.5138;-47.7707;0;Bottom;TXT19
408;;;90.5138;-9.65828;0;Bottom;TXT19
409;;;90.5138;-32.4553;0;Bottom;TXT19
410;;;98.7625;-12.5175;0;Bottom;TXT19
411;;;76.64;-47.7896;-90;Bottom;TXT19
412;;;23.0632;-3.0324;0;Bottom;Copper Fill317
413;;;48.0568;-2.372;0;Bottom;Copper Fill336
414;;;37.6317;-7.61951;0;Bottom;TXT6
415;180k;0805 [SMD];52.7591;-6.38318;90;Top;R3
416;;;58.0644;-17.2183;0;Bottom;Copper Fill251
417;330k;0805 [SMD];67.9992;-14.0032;-90;Top;R16
418;;;95.631;-20.9013;0;Bottom;Copper Fill81
419;;;40.2844;-46.7585;0;Bottom;Copper Fill30
420;;;90.5138;-37.5918;0;Bottom;TXT19
421;;;14.6591;-29.6334;0;Bottom;Via35
422;;;23.0632;-7.452;0;Bottom;Copper Fill288
423;;;24.4094;-20.9521;0;Bottom;Copper Fill73
424;;;55.3974;-30.9089;0;Bottom;Copper Fill42
425;;;85.1408;-51.4575;0;Bottom;Copper Fill25
426;;;36.8841;-11.8534;0;Bottom;Via4
427;;;86.1568;-49.2477;0;Bottom;Copper Fill171
428;;;89.8906;-24.3557;0;Bottom;Copper Fill52
429;330k;0805 [SMD];50.2192;-14.0032;-90;Top;R2
430;;;43.5356;-22.1205;0;Bottom;Copper Fill241
431;;;55.7276;-29.4357;0;Bottom;Copper Fill204
432;;;69.0011;-47.7896;-90;Bottom;TXT19
433;;;12.7381;-7.8965;0;Bottom;Copper Fill97
434;;;15.4755;-5.53168;-90;Bottom;TXT20
435;;;12.9587;-5.04509;-90;Bottom;TXT20
436;;;48.5756;-48.0494;-90;Bottom;TXT19
437;;;1.7272;-23.3524;0;Bottom;Copper Fill315
438;;;10.414;-36.2429;0;Bottom;Copper Fill209
439;180k;0805 [SMD];62.9191;-6.38318;90;Top;R11
440;;;77.6732;-11.9224;0;Bottom;Copper Fill119
441;;;90.2208;-23.1111;0;Bottom;Copper Fill66
442;;;60.5536;-16.8627;0;Bottom;Copper Fill254
443;;;62.5094;-49.2985;0;Bottom;Copper Fill34
444;;;23.9268;-7.452;0;Bottom;Copper Fill289
445;;;15.494;-36.8779;0;Bottom;Copper Fill211
446;;;26.0096;-45.4377;0;Bottom;Copper Fill1
447;;;12.7381;-9.5729;0;Bottom;Copper Fill96
448;330k;0805 [SMD];52.7592;-14.0032;-90;Top;R4
449;;;47.6377;-1.9529;0;Bottom;Copper Fill157
450;;;94.0341;-2.96335;0;Bottom;Via26
451;;;90.5138;-24.9968;0;Bottom;TXT19
452;;;29.4149;-47.6956;-90;Bottom;TXT19
453;;;77.4573;-19.9869;0;Bottom;Copper Fill306
454;;;97.7773;-3.4769;0;Bottom;Copper Fill110
455;;;77.4573;-24.1779;0;Bottom;Copper Fill299
456;180k;0805 [SMD];60.3791;-6.38318;90;Top;R9
457;;;97.7773;-3.4769;0;Bottom;Copper Fill294
458;;;70.5391;-10.5834;0;Bottom;Via34
459;;;40.4368;-51.4575;0;Bottom;Copper Fill10
460;;;54.9529;-26.7179;0;Bottom;Copper Fill291
461;;;93.9673;-6.6519;0;Bottom;Copper Fill319
462;;;24.4348;-30.9089;0;Bottom;Copper Fill195
463;;;18.1849;-5.52717;-90;Bottom;TXT20
464;;;53.5432;-18.3613;0;Bottom;Copper Fill249
465;;;73.1266;-49.2985;0;Bottom;Copper Fill168
466;;so014;81.3342;-31.1634;0;Top;IC2
467;;;95.631;-18.3613;0;Bottom;Copper Fill83
468;;;7.8994;-43.9899;0;Bottom;Copper Fill173
469;;;95.3262;-49.2223;0;Bottom;Copper Fill167
402;;;23.0632;-7.452;0;Bottom;Copper Fill269
403;;;66.6877;-10.2079;0;Bottom;Copper Fill309
404;;;77.0128;-24.6224;0;Bottom;Copper Fill281
405;;;34.3408;-24.2541;0;Bottom;Copper Fill47
406;;;83.6168;-26.5401;0;Bottom;Copper Fill210
407;;;50.8964;-26.4583;0;Bottom;Part1
408;;;66.7291;-10.5834;0;Bottom;Via20
409;;;54.0291;-10.5834;0;Bottom;Via15
410;;;2.5781;-24.1779;0;Bottom;Copper Fill294
411;;;77.4573;-19.9869;0;Bottom;Copper Fill104
412;;;97.7773;-3.4769;0;Bottom;Copper Fill93
413;;;61.341;-33.4489;0;Bottom;Copper Fill195
414;;;32.6898;-45.7933;0;Bottom;Copper Fill7
415;330k;0805 [SMD];57.8392;-14.0032;-90;Top;R8
416;;;97.8441;-2.96335;0;Bottom;Via27
417;;;43.8691;-11.8534;0;Bottom;Via21
418;;;71.1962;-27.8101;0;Bottom;Copper Fill209
419;;;10.414;-36.2429;0;Bottom;Copper Fill190
420;;;95.3262;-31.5439;0;Bottom;Copper Fill29
421;;;55.118;-11.4525;0;Bottom;Copper Fill242
422;;;35.6141;-12.4884;0;Bottom;Via7
423;;;62.2808;-33.0171;0;Bottom;Copper Fill196
424;;;89.7128;-27.0989;0;Bottom;Copper Fill32
425;;;65.5574;-16.2531;0;Bottom;Copper Fill238
426;;;53.5432;-18.3613;0;Bottom;Copper Fill230
427;;;95.3262;-41.7039;0;Bottom;Copper Fill19
428;;;31.9549;-47.6956;-90;Bottom;TXT19
429;;;95.3262;-11.2239;0;Bottom;Copper Fill240
430;;;29.4894;-39.9005;0;Bottom;Copper Fill172
431;330k;0805 [SMD];55.2992;-14.0032;-90;Top;R6
432;;;51.0286;-19.5043;0;Bottom;Copper Fill229
433;;;51.4604;-6.3979;0;Bottom;Copper Fill250
434;;;41.9641;-1.05835;0;Bottom;Via38
435;;;61.6204;-6.3979;0;Bottom;Copper Fill254
436;;;10.5156;-45.6917;0;Bottom;Copper Fill145
437;;;27.9908;-30.9089;0;Bottom;Copper Fill23
438;;;12.7381;-7.8965;0;Bottom;Copper Fill80
439;;;48.5756;-48.0494;-90;Bottom;TXT19
440;;;88.3191;-30.2684;0;Bottom;Via32
441;;;78.232;-48.9175;0;Bottom;Copper Fill151
442;;;93.9673;-2.5879;0;Bottom;Copper Fill141
443;;;7.8994;-43.9899;0;Bottom;Copper Fill154
444;;;77.4573;-19.0979;0;Bottom;Copper Fill105
445;;;47.2694;-47.3935;0;Bottom;Copper Fill11
446;;;98.6693;-32.7432;0;Bottom;TXT19
447;;;54.9529;-26.7179;0;Bottom;Copper Fill90
448;;;90.5138;-45.3247;0;Bottom;TXT19
449;;;18.1849;-5.52717;-90;Bottom;TXT20
450;;;39.5478;-6.3217;0;Bottom;Copper Fill260
451;;;95.3262;-46.7839;0;Bottom;Copper Fill17

File diff suppressed because it is too large Load Diff

View File

@ -2,353 +2,35 @@
; THROUGH (PLATED) HOLES START AT T100
M48
INCH
T1C0.125984
T2C0.165354
T100C0.059055
T101C0.070000
T102C0.031496
T103C0.031497
T104C0.035000
T105C0.038194
T106C0.040000
T107C0.042000
T108C0.030000
T109C0.038000
T110C0.039370
T111C0.015748
T1C0.165354
T2C0.125984
T100C0.030000
T101C0.038000
T102C0.039370
T103C0.015748
T104C0.059055
T105C0.070000
T106C0.031496
T107C0.031497
T108C0.035000
T109C0.038194
T110C0.040000
T111C0.042000
%
T1
X001437Y030579
X001437Y021481
T2
X035411Y031280
X037661Y012280
T2
X001437Y021481
X001437Y030579
T100
X036411Y034811
X036411Y036780
T101
X012411Y024280
X012411Y022280
X012411Y028280
X012411Y026280
T102
X033911Y034030
X033911Y036983
T103
X018161Y033045
X025911Y023030
X025177Y015030
X026161Y015030
X018161Y034030
X018161Y035045
X025177Y017030
X005421Y033789
X005421Y032805
X026161Y017030
X018161Y036030
X024927Y021030
X025911Y021030
X005421Y035789
X005421Y034805
X024927Y023030
T104
X010911Y032530
X023161Y010780
X020911Y010280
X037911Y006280
X023161Y006780
X016411Y014530
X031911Y014530
X031411Y002280
X017411Y006030
X017411Y018530
X032911Y007280
X019661Y030280
X024161Y036280
X024161Y013780
X032911Y010280
X016661Y037780
X004661Y019030
X019661Y026280
X016652Y033521
X020661Y030280
X016661Y035530
X020661Y026280
X031661Y023280
X029161Y013280
X012911Y011280
X029911Y006030
X021411Y006030
X035911Y017530
X015911Y011030
X016661Y034530
X022661Y021030
X023661Y030280
X020661Y018780
X012911Y007280
X031661Y022280
X015911Y007030
X012411Y006280
X021911Y007280
X037911Y002280
X023661Y025030
X023661Y026280
X029911Y005030
X030911Y007280
X035911Y016530
X021911Y010280
X017661Y030280
X030911Y010280
X031661Y021280
X017411Y014530
X021911Y018780
X017661Y026280
X016661Y029530
X023161Y017780
X035911Y015530
X024161Y032280
X033911Y006030
X033911Y007280
X012652Y036521
X016661Y032530
X031661Y020280
X006911Y037780
X006911Y036530
X033911Y010280
X018911Y007280
X035911Y014530
X027661Y010780
X033911Y005030
X035411Y002280
X018911Y010280
X021661Y030280
X006911Y035530
X027661Y006780
X024661Y030030
X021661Y026280
X006911Y034530
X012661Y037780
X023661Y021030
X000661Y019030
X010911Y037780
X010911Y036530
X025911Y030030
X012652Y033521
X024661Y025030
X020661Y013780
X035661Y023280
X016411Y018530
X031911Y007280
X006911Y033530
X012661Y035530
X018661Y030280
X016661Y025530
X010911Y035530
X023161Y013780
X031911Y010280
X018661Y026280
X025161Y013280
X035661Y022280
X024161Y017780
X016411Y006280
X031911Y017530
X006911Y032530
X025911Y025030
X021911Y013780
X012661Y034530
X010911Y034530
X035661Y021280
X019911Y007280
X031911Y016530
X010911Y033530
X014911Y011030
X019911Y010280
X016652Y036521
X022661Y030280
X035661Y020280
X014911Y007030
X031911Y015530
X020911Y007280
X022661Y025030
X022661Y026280
X012661Y032530
T105
X037911Y025280
X017911Y012280
X036911Y017280
X017911Y031280
X026911Y012280
X026911Y031280
X036911Y020280
X035911Y012280
X037911Y024280
X036911Y016280
X012311Y031280
X029911Y012280
X029911Y031280
X037911Y023280
X012911Y012280
X036911Y015280
X021911Y012280
X021911Y031280
X037911Y019280
X030911Y012280
X015311Y031280
X030911Y031280
X037911Y022280
X036911Y014280
X015911Y012280
X037911Y018280
X024911Y012280
X009311Y031280
X024911Y031280
X036911Y029280
X033911Y012280
X037911Y021280
X033911Y031280
X037911Y017280
X010311Y031280
X018911Y031280
X036911Y028280
X027911Y031280
X037911Y020280
X036911Y031280
X010911Y012280
X037911Y016280
X036911Y027280
X013311Y031280
X036911Y030280
X037911Y015280
X013911Y012280
X022911Y012280
X036911Y026280
X007311Y031280
X022911Y031280
X031911Y012280
X016311Y031280
X031911Y031280
X037911Y014280
X016911Y012280
X036911Y025280
X025911Y012280
X037911Y029280
X034911Y012280
X036911Y024280
X019911Y012280
X011311Y031280
X019911Y031280
X037911Y028280
X028911Y012280
X028911Y031280
X037911Y031280
X036911Y023280
X011911Y012280
X020911Y012280
X037911Y027280
X020911Y031280
X036911Y019280
X014311Y031280
X037911Y030280
X036911Y022280
X014911Y012280
X037911Y026280
X023911Y012280
X036911Y018280
X008311Y031280
X023911Y031280
X032911Y012280
X032911Y031280
X036911Y021280
T106
X008911Y003780
X007911Y008780
X008911Y016780
X008911Y008780
X006161Y024530
X007911Y022780
X007911Y014780
X008911Y022780
X007911Y006780
X008911Y014780
X007911Y019780
X008911Y006780
X008911Y019780
X007911Y020780
X006161Y027530
X007911Y012780
X008911Y020780
X007911Y004780
X008911Y012780
X007911Y017780
X008911Y004780
X007911Y009780
X008911Y017780
X008911Y009780
X006161Y025530
X007911Y010780
X006161Y023529
X008911Y010780
X007911Y015780
X007911Y007780
X008911Y015780
X008911Y007780
X007911Y021780
X006161Y028530
X007911Y013780
X008911Y021780
X007911Y005780
X008911Y013780
X007911Y018780
X008911Y005780
X008911Y018780
X006161Y026530
X007911Y011780
X007911Y003780
X008911Y011780
X007911Y016780
T107
X020661Y024780
X021931Y037280
X014911Y025030
X030661Y036280
X003891Y037780
X025161Y033280
X001411Y033030
X003411Y033030
X014911Y028280
X018661Y022280
X021161Y033030
X002411Y033030
X011911Y010760
X019661Y022280
X022161Y033030
X020161Y033030
X014911Y023030
X030661Y033300
X028661Y037030
X026661Y037030
X020661Y022280
X027661Y037030
X002421Y035289
X000911Y036530
X014911Y029280
X001421Y035289
X003421Y035289
X014911Y024030
X020911Y037280
X018661Y024780
X019661Y024780
X014911Y027280
X024911Y037280
X011911Y007780
X000911Y037780
X017931Y037280
X021161Y035280
X003891Y036530
X025161Y036260
X022161Y035280
X020161Y035280
T108
X024411Y010280
X025911Y008280
X013911Y007780
X025411Y005780
X014411Y016530
X032161Y035780
X015411Y016530
X013911Y013780
X011911Y013780
X004911Y016780
@ -402,22 +84,7 @@ X023411Y005780
X014661Y003780
X016661Y003780
X037911Y009030
X024411Y010280
X025911Y008280
X013911Y007780
X025411Y005780
X014411Y016530
X032161Y035780
X015411Y016530
T109
X001911Y009530
X001911Y012530
X005911Y002530
X035661Y008780
X004911Y013530
X003911Y005530
X001911Y008530
X004911Y009530
T101
X001911Y011530
X004911Y012530
X003911Y004530
@ -493,9 +160,15 @@ X005911Y003530
X035661Y009780
X004911Y014530
X003911Y006530
T110
X027661Y015530
X030661Y014530
X001911Y009530
X001911Y012530
X005911Y002530
X035661Y008780
X004911Y013530
X003911Y005530
X001911Y008530
X004911Y009530
T102
X027661Y016530
X030661Y015530
X027661Y020530
@ -510,7 +183,17 @@ X027661Y023530
X030661Y022530
X027661Y014530
X030661Y023530
T111
X027661Y015530
X030661Y014530
T103
X030661Y002780
X010661Y003530
X031161Y008530
X008911Y032780
X021411Y016780
X018911Y012280
X035161Y018280
X035661Y004280
X030661Y006030
X038161Y013030
X013411Y016280
@ -547,13 +230,330 @@ X022161Y029530
X012411Y003780
X015023Y006280
X029661Y023530
X010661Y003530
X030661Y002780
X031161Y008530
X008911Y032780
X021411Y016780
X018911Y012280
X035161Y018280
X035661Y004280
T104
X036411Y034811
X036411Y036780
T105
X012411Y026280
X012411Y024280
X012411Y022280
X012411Y028280
T106
X033911Y036983
X033911Y034030
T107
X025177Y015030
X026161Y015030
X018161Y034030
X018161Y035045
X025177Y017030
X005421Y033789
X005421Y032805
X026161Y017030
X018161Y036030
X024927Y021030
X025911Y021030
X005421Y035789
X005421Y034805
X024927Y023030
X018161Y033045
X025911Y023030
T108
X024161Y013780
X032911Y010280
X016661Y037780
X004661Y019030
X019661Y026280
X016652Y033521
X020661Y030280
X016661Y035530
X020661Y026280
X031661Y023280
X029161Y013280
X012911Y011280
X029911Y006030
X021411Y006030
X035911Y017530
X015911Y011030
X016661Y034530
X022661Y021030
X023661Y030280
X020661Y018780
X012911Y007280
X031661Y022280
X015911Y007030
X012411Y006280
X021911Y007280
X037911Y002280
X023661Y025030
X023661Y026280
X029911Y005030
X030911Y007280
X035911Y016530
X021911Y010280
X017661Y030280
X030911Y010280
X031661Y021280
X017411Y014530
X021911Y018780
X017661Y026280
X016661Y029530
X023161Y017780
X035911Y015530
X024161Y032280
X012652Y036521
X033911Y006030
X033911Y007280
X016661Y032530
X031661Y020280
X006911Y037780
X006911Y036530
X033911Y010280
X018911Y007280
X035911Y014530
X027661Y010780
X033911Y005030
X035411Y002280
X018911Y010280
X021661Y030280
X006911Y035530
X027661Y006780
X024661Y030030
X021661Y026280
X006911Y034530
X012661Y037780
X023661Y021030
X000661Y019030
X010911Y037780
X010911Y036530
X025911Y030030
X012652Y033521
X024661Y025030
X020661Y013780
X035661Y023280
X016411Y018530
X031911Y007280
X006911Y033530
X012661Y035530
X018661Y030280
X016661Y025530
X023161Y013780
X010911Y035530
X031911Y010280
X018661Y026280
X025161Y013280
X035661Y022280
X024161Y017780
X016411Y006280
X031911Y017530
X006911Y032530
X025911Y025030
X021911Y013780
X012661Y034530
X010911Y034530
X035661Y021280
X019911Y007280
X031911Y016530
X010911Y033530
X014911Y011030
X019911Y010280
X016652Y036521
X022661Y030280
X035661Y020280
X014911Y007030
X020911Y007280
X031911Y015530
X022661Y025030
X022661Y026280
X012661Y032530
X023161Y010780
X010911Y032530
X020911Y010280
X037911Y006280
X023161Y006780
X016411Y014530
X031911Y014530
X031411Y002280
X017411Y006030
X017411Y018530
X032911Y007280
X019661Y030280
X024161Y036280
T109
X012311Y031280
X029911Y012280
X029911Y031280
X037911Y023280
X012911Y012280
X036911Y015280
X021911Y012280
X021911Y031280
X037911Y019280
X030911Y012280
X015311Y031280
X030911Y031280
X037911Y022280
X036911Y014280
X015911Y012280
X037911Y018280
X024911Y012280
X009311Y031280
X024911Y031280
X036911Y029280
X033911Y012280
X037911Y021280
X033911Y031280
X037911Y017280
X010311Y031280
X018911Y031280
X036911Y028280
X027911Y031280
X037911Y020280
X036911Y031280
X010911Y012280
X037911Y016280
X036911Y027280
X013311Y031280
X036911Y030280
X037911Y015280
X013911Y012280
X022911Y012280
X036911Y026280
X007311Y031280
X022911Y031280
X031911Y012280
X016311Y031280
X031911Y031280
X037911Y014280
X016911Y012280
X036911Y025280
X025911Y012280
X037911Y029280
X034911Y012280
X036911Y024280
X019911Y012280
X011311Y031280
X019911Y031280
X037911Y028280
X028911Y012280
X028911Y031280
X037911Y031280
X036911Y023280
X011911Y012280
X020911Y012280
X020911Y031280
X037911Y027280
X036911Y019280
X014311Y031280
X037911Y030280
X036911Y022280
X014911Y012280
X037911Y026280
X023911Y012280
X036911Y018280
X008311Y031280
X023911Y031280
X032911Y012280
X032911Y031280
X036911Y021280
X037911Y025280
X017911Y012280
X036911Y017280
X017911Y031280
X026911Y012280
X026911Y031280
X036911Y020280
X035911Y012280
X037911Y024280
X036911Y016280
T110
X008911Y005780
X007911Y013780
X008911Y018780
X007911Y005780
X007911Y018780
X006161Y026530
X008911Y011780
X008911Y003780
X007911Y011780
X008911Y016780
X007911Y003780
X008911Y008780
X007911Y016780
X006161Y024530
X007911Y008780
X008911Y022780
X008911Y014780
X007911Y022780
X008911Y006780
X007911Y014780
X008911Y019780
X007911Y006780
X007911Y019780
X006161Y027530
X008911Y020780
X008911Y012780
X007911Y020780
X008911Y004780
X007911Y012780
X008911Y017780
X007911Y004780
X008911Y009780
X007911Y017780
X006161Y025530
X006161Y023529
X007911Y009780
X008911Y010780
X007911Y010780
X008911Y015780
X008911Y007780
X007911Y015780
X007911Y007780
X006161Y028530
X008911Y021780
X008911Y013780
X007911Y021780
T111
X024911Y037280
X020911Y037280
X011911Y007780
X000911Y037780
X017931Y037280
X021161Y035280
X003891Y036530
X025161Y036260
X022161Y035280
X020161Y035280
X020661Y024780
X021931Y037280
X014911Y025030
X030661Y036280
X003891Y037780
X025161Y033280
X001411Y033030
X003411Y033030
X014911Y028280
X018661Y022280
X021161Y033030
X002411Y033030
X011911Y010760
X019661Y022280
X022161Y033030
X020161Y033030
X014911Y023030
X030661Y033300
X028661Y037030
X026661Y037030
X020661Y022280
X027661Y037030
X002421Y035289
X000911Y036530
X014911Y029280
X001421Y035289
X003421Y035289
X014911Y024030
X018661Y024780
X019661Y024780
X014911Y027280
T00
M30

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,7 @@
MTversion = 2.25
queryCommand = "Q"
signature = "speeduino 201801-dev"
signature = "speeduino 201803-dev"
versionInfo = "S" ;This info is what is displayed to user
[TunerStudio]
@ -26,6 +26,9 @@
;settingOption = BOOSTPSI, "PSI"
settingGroup = enablehardware_test, "Enable Hardware Test Page"
settingGroup = resetcontrol_group, "Reset Control Features"
settingOption = resetcontrol_standard, "Basic Options Only"
settingOption = resetcontrol_adv, "Advanced Features (16u2 Firmware Update Required)"
[PcVariables]
; valid types: boolean, double, int, list
@ -281,10 +284,16 @@ page = 4
useResync = bits, U08, 6,[7:7], "No", "Yes"
sparkDur = scalar, U08, 7, "ms", 0.1, 0, 0, 25.5, 1 ; Spark duration
trigPatternSec = bits, U08, 8,[0:7], "Single tooth cam", "4-1 cam", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
bootloaderCaps = scalar, U08, 9, "level", 1, 0, 0, 255, 0
resetControl_custom = bits, U08, 10,[0:1], "Disabled", "Prevent When Running", "Prevent Always", "Serial Command"
resetControl_standard = bits, U08, 10,[0:1], "Disabled", "INVALID", "INVALID", "Enabled"
resetControlPin = bits, U08, 10,[2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
;Reset Control
bootloaderCaps = scalar, U08, 9, "level", 1, 0, 0, 255, 0
#if resetcontrol_adv
resetControl = bits, U08, 10,[0:1], "Disabled", "Prevent When Running", "Prevent Always", "Serial Command"
#else
resetControl = bits, U08, 10,[0:1], "Disabled", "INVALID", "INVALID", "Serial Command"
#endif
resetControlPin = bits, U08, 10,[2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
SkipCycles = scalar, U08, 11, "cycles", 1, 0, 0, 255, 0
; name = array, type, offset, shape, units, scale, translate, lo, hi, digits
@ -300,7 +309,7 @@ page = 4
numTeeth = scalar, U08, 15, "teeth", 1.0, 0.0, 0.0, 255, 0
missingTeeth = scalar, U08, 16, "teeth", 1.0, 0.0, 0.0, 255, 0
crankRPM = scalar, U08, 17, "rpm", 100, 0.0, 100, 1000, 0
crankRPM = scalar, U08, 17, "rpm", 10, 0.0, 100, 1000, 0
tpsflood = scalar, U08, 18, "%", 1.0, 0.0, 0.0, 255.0, 0
;Rev Limits
@ -465,7 +474,7 @@ page = 6
; Begin fan control vairables
fanInv = bits, U08, 120, [0:0], "No", "Yes"
fanEnable = bits, U08, 120, [1:1], "Off", "On/Off"
fanPin = bits, U08, 120, [2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
fanPin = bits , U08, 120, [2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
#if CELSIUS
fanSP = scalar, U08, 121, "C", 1.0, -40, -40, 215.0, 0
fanHyster = scalar, U08, 122, "C", 1.0, 0.0, 0.0, 40, 0
@ -728,7 +737,7 @@ page = 10
flexAdvBins = array, U08, 63, [6], "%", 1.0, 0.0, 0.0, 250.0, 0
flexAdvAdj = array, U08, 69, [6], "Deg", 1.0, 0.0, 0.0, 250.0, 0
unused11_75_192 = array, U08, 75,[117],"RPM", 100.0, 0.0, 100, 25500, 0
unused11_75_191 = array, U08, 75,[116],"RPM", 100.0, 0.0, 100, 25500, 0
;-------------------------------------------------------------------------------
@ -765,8 +774,7 @@ page = 10
requiresPowerCycle = stagedInjSizePri
requiresPowerCycle = stagedInjSizeSec
requiresPowerCycle = stagingEnabled
requiresPowerCycle = resetControl_custom
requiresPowerCycle = resetControl_standard
requiresPowerCycle = resetControl
requiresPowerCycle = resetControlPin
defaultValue = pinLayout, 1
@ -818,8 +826,7 @@ page = 10
defaultValue = VVTasOnOff, 0
defaultValue = stagingEnabled, 0
defaultValue = lnchCtrlTPS, 0
defaultValue = resetControl_custom, 0
defaultValue = resetControl_standard, 0
defaultValue = resetControl, 0
defaultValue = bootloaderCaps, 0
; defaultValue = obd_address, 0
@ -883,7 +890,7 @@ menuDialog = main
subMenu = afrTable1Tbl, "AFR Table", 5
subMenu = std_separator
subMenu = inj_trimad, "Sequential fuel trim", 9
subMenu = stagingTableDialog, "Staged Injection", 10
subMenu = stagingTableDialog, "Staged Injection", 10, { nCylinders <= 4 } ; Can't do staging on more than 4 cylinder engines
menu = "&Spark"
subMenu = sparkSettings, "Spark Settings"
@ -1114,9 +1121,11 @@ menuDialog = main
stagedInjSizePri= "Size of the primary injectors. The sum of the Pri and Sec injectors values MUST match the value used in the req_fuel calculation"
stagedInjSizeSec= "Size of the secondary injectors. The sum of the Pri and Sec injectors values MUST match the value used in the req_fuel calculation"
resetControl_standard = "Whether to enable reset control of the Arduino's automatic reset feature. If this feature is enabled, the selected control pin will be held high at all times. In order to update your Speeduino's firmware, you will first need to open a serial terminal and send a 'U' command so that the Arduino resets when the upload starts. The control pin should be connected to the Arduino's reset pin."
resetControl_custom = "How to control the Arduino's automatic reset feature. NOTE: Some of these settings require modifying your hardware and replacing the Arduino bootloader. See the Wiki for more details.\n\nDisabled: Allow the Arduino to reset when a new serial connection is made.\n\nPrevent When Running: Hold the control pin high while the engine is running.\n\nPrevent Always: Always hold the control pin high.\n\nSerial Command: Normally hold the control pin high, but pull it low when the 'U' serial command is issued and reset upon receiving more data."
#if resetcontrol_adv
resetControl = "How to control the Arduino's automatic reset feature. NOTE: Some of these settings require modifying your hardware and replacing the Arduino bootloader. See the Wiki for more details.\n\nDisabled: Allow the Arduino to reset when a new serial connection is made.\n\nPrevent When Running: Hold the control pin high while the engine is running.\n\nPrevent Always: Always hold the control pin high.\n\nSerial Command: Normally hold the control pin high, but pull it low when the 'U' serial command is issued and reset upon receiving more data."
#else
resetControl = "If set to Serial Command, normally hold the control pin high but pull it low when the 'U' serial command is issued and reset upon receiving more data. The control pin should be connected to the Arduino's reset pin."
#endif
resetControlPin = "The Arduino pin used to control resets."
[UserDefined]
@ -1169,18 +1178,23 @@ menuDialog = main
field = "Low (E0) ", flexFreqLow, { flexEnabled }
field = "High (E100) ", flexFreqHigh, { flexEnabled }
dialog = flexFuelWest, "", border
panel = flexFuelSettings, North
dialog = flexCurves, "", indexCard
dialog = flexFuelWest, ""
panel = flex_fuel_curve, { flexEnabled }
panel = flex_adv_curve, { flexEnabled }
dialog = flexFuelEast, ""
panel = flex_boost_curve, { flexEnabled && boostEnabled }
;dialog = flexCurves, "", indexCard
dialog = flexCurves, "", xAxis
panel = flexFuelWest, West
panel = flexFuelEast, East
dialog = flexFueling, "Fuel Sensor Settings", border
topicHelp = "http://speeduino.com/wiki/index.php/Flex_Fuel"
panel = flexFuelWest, West
panel = flexCurves, Center
;panel = flexFuelWest, West
panel = flexFuelSettings, North
panel = flexCurves, South
dialog = tacho, "Tacho"
field = "Output pin", tachoPin
@ -1290,9 +1304,11 @@ menuDialog = main
dialog = crankingEnrichDialog, "Cranking Enrichment", yAxis
panel = cranking_enrich_curve
field = "#Note"
field = "Values are specified as modifiers to the normal fueling. Eg 100% = No change."
dialog = crankingIgnOptions, "Cranking Timing", yAxis
field = "Cranking advance Angle", CrankAng
field = "Cranking advance Angle", CrankAng, { ignCranklock == 0 }
field = "Cranking bypass", ignBypassEnable
field = "Bypass output pin", ignBypassPin { ignBypassEnable }
field = "Fix cranking timing with trigger", ignCranklock, { TrigPattern == 1 || TrigPattern == 4 || TrigPattern == 10 || TrigPattern == 9 }
@ -1809,9 +1825,7 @@ menuDialog = main
dialog = reset_control, "Reset Control"
; Control type options for custom firmware
field = "Control Type", resetControl_custom, { bootloaderCaps > 0 }, { bootloaderCaps > 0 }
; Control type options for standard / unmodifyable firmware
field = "Control Type", resetControl_standard, { bootloaderCaps == 0 }, { bootloaderCaps == 0 }
field = "Control Type", resetControl
field = "Control Pin", resetControlPin
;-------------------------------------------------------------------------------
@ -1980,7 +1994,7 @@ cmdtestspk450dc = "E\x03\x0C"
; Cranking enrichment curve
curve = cranking_enrich_curve, "Cranking Enrichment Curve"
columnLabel = "Coolant", "Enrich %"
columnLabel = "Coolant", "Fuel Modifier"
xAxis = -40, 110, 9
yAxis = 0, 200, 6
xBins = crankingEnrichBins, coolant
@ -1998,23 +2012,23 @@ cmdtestspk450dc = "E\x03\x0C"
; Flex fuel correction curves
curve = flex_fuel_curve, "Flex Fuel Adjustments"
columnLabel = "Ethanol", "Fuel"
xAxis = 0, 100, 5
yAxis = 0, 255, 10
xAxis = 0, 100, 10
yAxis = 50, 250, 5
xBins = flexFuelBins, flex
yBins = flexFuelAdj
size = 400, 200
curve = flex_adv_curve, "Flex Timing Advance"
columnLabel = "Ethanol", "Advance"
xAxis = 0, 100, 5
yAxis = 0, 100, 5
xAxis = 0, 100, 10
yAxis = 0, 50, 5
xBins = flexAdvBins, flex
yBins = flexAdvAdj
size = 400, 200
curve = flex_boost_curve, "Flex Boost Adjustments"
columnLabel = "Ethanol", "Boost"
xAxis = 0, 100, 5
xAxis = 0, 100, 10
yAxis = -100, 200, 5
xBins = flexBoostBins, flex
yBins = flexBoostAdj
@ -2182,6 +2196,10 @@ cmdtestspk450dc = "E\x03\x0C"
tachometer = rpm, "Engine Speed", "RPM", 0, 8000, 300, 600, 3000, 5000, 0, 0
veGauge = veCurr, "VE Current", "%", 0, 120, -1, -1, 999, 999, 0, 0
warmupEnrichGauge = warmupEnrich, "Warmup Enrichment", "%", 100, 200, 130, 140, 140, 150, 0, 0
aseEnrichGauge = ase_enrich, "Afterstart Enrichment","%", 0, 200, 130, 140, 140, 150, 0, 0
batCorrectGauge = batCorrection, "Voltage Correction", "%", 0, 200, 130, 140, 140, 150, 0, 0
iatCorrectGauge = airCorrection, "IAT Correction", "%", 0, 200, 130, 140, 140, 150, 0, 0
flexEnrich, = flexFuelCor, "Flex Correction", "%", 0, 200, 130, 140, 140, 150, 0, 0
advanceGauge = advance, "Spark Advance", "deg BTDC", 50, -10, 0, 0, 35, 45, 0, 0
dwellGauge = dwell, "Ign Dwell", "mSec", 0, 35.0, 1.0, 1.2, 20, 25, 3, 3
@ -2232,6 +2250,10 @@ cmdtestspk450dc = "E\x03\x0C"
clockGauge = secl, "Clock", "Seconds", 0, 255, 10, 10, 245, 245, 0, 0
loopGauge = loopsPerSecond,"Main loop speed", "Loops/S" , 0, 70000, -1, 500,1800, 4000, 0, 0
memoryGauge = freeRAM, "Free memory", "bytes" , 0, 8000, -1, 1000,8000, 1000, 0, 0
reqFuelGauge = req_fuel, "Req. Fuel", "ms", 0, 35.0, 1.0, 1.2, 20, 25, 2, 2
injOpenGauge = inj_open, "Injector Open Time", "ms", 0, 35.0, 1.0, 1.2, 20, 25, 1, 1
mapMultiplyGauge = map_multiply_amt, "MAP Multiply", "%", 0, 200, 130, 140, 140, 150, 0, 0
nSquirtsGauge = nSquirts, "# Squirts", "", 0, 10, 130, 140, 140, 150, 0, 0
;-------------------------------------------------------------------------------
[FrontPage]
@ -2394,6 +2416,11 @@ cmdtestspk450dc = "E\x03\x0C"
lambda = { afr / stoich }
MAPxRPM = { rpm * map }
loopsPerRev = { loopsPerSecond / (rpm / 60) }
req_fuel = { reqFuel }
inj_open = { injOpen }
ase_enrich = { ase ? (100 + asePct ) : 100 } ; If ASE is active then equal the ASE + 100
map_multiply_amt = { multiplyMAP ? map : 100 } ; If multiply MAP is enabled, use the current MAP value, otherwise 100%
nSquirts = { nCylinders / divider }
;Manifold pressure in weirdo units
map_bar = { (map - baro) / 101.33 }

View File

@ -39,11 +39,21 @@ void initialiseAuxPWM()
TCCR1A = 0x00; //Timer1 Control Reg A: Wave Gen Mode normal (Simply counts up from 0 to 65535 (16-bit int)
TCCR1B = (1 << CS12); //Timer1 Control Reg B: Timer Prescaler set to 256. 1 tick = 16uS. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg
#elif defined(CORE_TEENSY)
//REALLY NEED TO DO THIS!
#elif defined(CORE_STM32)
Timer1.attachInterrupt(2, boostInterrupt);
Timer1.attachInterrupt(3, vvtInterrupt);
Timer1.resume();
//FlexTimer 1 is used for boost and VVT. There are 8 channels on this module
FTM1_MODE |= FTM_MODE_WPDIS; // Write Protection Disable
FTM1_MODE |= FTM_MODE_FTMEN; //Flex Timer module enable
FTM1_MODE |= FTM_MODE_INIT;
FTM1_SC |= FTM_SC_CLKS(0b1); // Set internal clocked
FTM1_SC |= FTM_SC_PS(0b111); //Set prescaler to 128 (2.1333uS tick time)
//Enable each compare channel individually
FTM1_C0SC &= ~FTM_CSC_MSB; //According to Pg 965 of the K64 datasheet, this should not be needed as MSB is reset to 0 upon reset, but the channel interrupt fails to fire without it
FTM1_C0SC |= FTM_CSC_MSA; //Enable Compare mode
FTM1_C0SC |= FTM_CSC_CHIE; //Enable channel compare interrupt
FTM1_C1SC &= ~FTM_CSC_MSB; //According to Pg 965 of the K64 datasheet, this should not be needed as MSB is reset to 0 upon reset, but the channel interrupt fails to fire without it
FTM1_C1SC |= FTM_CSC_MSA; //Enable Compare mode
FTM1_C1SC |= FTM_CSC_CHIE; //Enable channel compare interrupt
#endif
boost_pin_port = portOutputRegister(digitalPinToPort(pinBoost));
@ -51,14 +61,13 @@ void initialiseAuxPWM()
vvt_pin_port = portOutputRegister(digitalPinToPort(pinVVT_1));
vvt_pin_mask = digitalPinToBitMask(pinVVT_1);
#if defined(CORE_STM32) //2uS resolution Min 8Hz, Max 5KHz
boost_pwm_max_count = 1000000L / (configPage6.boostFreq * 2); //Converts the frequency in Hz to the number of ticks (at 16uS) it takes to complete 1 cycle. The x2 is there because the frequency is stored at half value (in a byte) to allow freqneucies up to 511Hz
vvt_pwm_max_count = 1000000L / (configPage6.vvtFreq * 2); //Converts the frequency in Hz to the number of ticks (at 16uS) it takes to complete 1 cycle
#if defined(CORE_STM32) || defined(CORE_TEENSY) //2uS resolution Min 8Hz, Max 5KHz
boost_pwm_max_count = 1000000L / (2 * configPage6.boostFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle. The x2 is there because the frequency is stored at half value (in a byte) to allow freqneucies up to 511Hz
vvt_pwm_max_count = 1000000L / (2 * configPage6.vvtFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle
#else
boost_pwm_max_count = 1000000L / (16 * configPage6.boostFreq * 2); //Converts the frequency in Hz to the number of ticks (at 16uS) it takes to complete 1 cycle. The x2 is there because the frequency is stored at half value (in a byte) to allow freqneucies up to 511Hz
vvt_pwm_max_count = 1000000L / (16 * configPage6.vvtFreq * 2); //Converts the frequency in Hz to the number of ticks (at 16uS) it takes to complete 1 cycle
#endif
//TIMSK1 |= (1 << OCIE1A); <---- Not required as compare A is turned on when needed by boost control
ENABLE_VVT_TIMER(); //Turn on the B compare unit (ie turn on the interrupt)
boostPID.SetOutputLimits(configPage2.boostMinDuty, configPage2.boostMaxDuty);
@ -67,6 +76,13 @@ void initialiseAuxPWM()
currentStatus.boostDuty = 0;
boostCounter = 0;
#if defined(CORE_STM32) //Need to be initialised last due to instant interrupt
Timer1.setMode(2, TIMER_OUTPUT_COMPARE);
Timer1.setMode(3, TIMER_OUTPUT_COMPARE);
if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);}
if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);}
Timer1.resume();
#endif
}
#define BOOST_HYSTER 40
@ -123,7 +139,7 @@ void boostControl()
}
}
else { // Disable timer channel and zero the flex boost correction status
DISABLE_BOOST_TIMER();
DISABLE_BOOST_TIMER();
currentStatus.flexBoostCorrection = 0;
}
@ -175,7 +191,7 @@ void boostDisable()
static inline void boostInterrupt() //Most ARM chips can simply call a function
#endif
{
if (boost_pwm_state)
if (boost_pwm_state == true)
{
BOOST_PIN_LOW(); // Switch pin to low
BOOST_TIMER_COMPARE = BOOST_TIMER_COUNTER + (boost_pwm_max_count - boost_pwm_cur_value);
@ -197,7 +213,7 @@ void boostDisable()
static inline void vvtInterrupt() //Most ARM chips can simply call a function
#endif
{
if (vvt_pwm_state)
if (vvt_pwm_state == true)
{
VVT_PIN_LOW(); // Switch pin to low
VVT_TIMER_COMPARE = VVT_TIMER_COUNTER + (vvt_pwm_max_count - vvt_pwm_cur_value);
@ -211,3 +227,17 @@ void boostDisable()
vvt_pwm_state = true;
}
}
#if defined(CORE_TEENSY)
void ftm1_isr(void)
{
//FTM1 only has 2 compare channels
//Use separate variables for each test to ensure conversion to bool
bool interrupt1 = (FTM1_C0SC & FTM_CSC_CHF);
bool interrupt2 = (FTM1_C1SC & FTM_CSC_CHF);
if(interrupt1) { FTM1_C0SC &= ~FTM_CSC_CHF; boostInterrupt(); }
else if(interrupt2) { FTM1_C1SC &= ~FTM_CSC_CHF; vvtInterrupt(); }
}
#endif

View File

@ -132,7 +132,7 @@ void command()
break;
case 'Q': // send code version
Serial.print("speeduino 201801-dev");
Serial.print("speeduino 201803-dev");
break;
case 'r': //New format for the optimised OutputChannels
@ -162,7 +162,7 @@ void command()
break;
case 'S': // send code version
Serial.print("Speeduino 2018.1-dev");
Serial.print("Speeduino 2018.3-dev");
currentStatus.secl = 0; //This is required in TS3 due to its stricter timings
break;

View File

@ -96,7 +96,7 @@ static inline byte correctionWUE()
{
//This prevents us doing the 2D lookup if we're already up to temp
BIT_CLEAR(currentStatus.engine, BIT_ENGINE_WARMUP);
WUEValue = 100;
WUEValue = WUETable.values[9]; //Set the current value to be whatever the final value on the curve is.
}
else
{
@ -159,7 +159,7 @@ static inline int16_t correctionAccel()
if( BIT_CHECK(currentStatus.engine, BIT_ENGINE_ACC) )
{
//If it is currently running, check whether it should still be running or whether it's reached it's end time
if( micros() >= currentStatus.TAEEndTime )
if( micros_safe() >= currentStatus.TAEEndTime )
{
//Time to turn enrichment off
BIT_CLEAR(currentStatus.engine, BIT_ENGINE_ACC);
@ -192,7 +192,7 @@ static inline int16_t correctionAccel()
if (rateOfChange > configPage2.tpsThresh)
{
BIT_SET(currentStatus.engine, BIT_ENGINE_ACC); //Mark accleration enrichment as active.
currentStatus.TAEEndTime = micros() + ((unsigned long)configPage2.taeTime * 10000); //Set the time in the future where the enrichment will be turned off. taeTime is stored as mS / 10, so multiply it by 100 to get it in uS
currentStatus.TAEEndTime = micros_safe() + ((unsigned long)configPage2.taeTime * 10000); //Set the time in the future where the enrichment will be turned off. taeTime is stored as mS / 10, so multiply it by 100 to get it in uS
accelValue = 100 + table2D_getValue(&taeTable, currentStatus.tpsDOT);
}
}
@ -280,7 +280,7 @@ static inline bool correctionDFCO()
static inline byte correctionFlex()
{
byte flexValue = 100;
if (configPage2.flexEnabled == 1)
{
flexValue = table2D_getValue(&flexFuelTable, currentStatus.ethanolPct);

View File

@ -262,11 +262,13 @@ int getCrankAngle_missingTooth(int timePerDegree)
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
tempRevolutionOne = revolutionOne;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
int crankAngle = ((tempToothCurrentCount - 1) * triggerToothAngle) + configPage4.triggerAngle; //Number of teeth that have passed since tooth 1, multiplied by the angle each tooth represents, plus the angle that tooth 1 is ATDC. This gives accuracy only to the nearest tooth.
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = (micros() - tempToothLastToothTime);
//crankAngle += DIV_ROUND_CLOSEST(elapsedTime, timePerDegree);
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -376,8 +378,6 @@ void triggerSec_DualWheel()
if(currentStatus.hasSync == false)
{
toothLastToothTime = micros();
//CONFIRM THE BELOW! IT DOESN'T LOOK RIGHT (toothOneTime??)
//toothLastMinusOneToothTime = (toothOneTime - 6000000) / configPage4.triggerTeeth; //Fixes RPM at 10rpm until a full revolution has taken place
toothLastMinusOneToothTime = micros() - (6000000 / configPage4.triggerTeeth); //Fixes RPM at 10rpm until a full revolution has taken place
toothCurrentCount = configPage4.triggerTeeth;
@ -411,6 +411,7 @@ int getCrankAngle_DualWheel(int timePerDegree)
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
tempRevolutionOne = revolutionOne;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
//Handle case where the secondary tooth was the last one seen
@ -418,7 +419,6 @@ int getCrankAngle_DualWheel(int timePerDegree)
int crankAngle = ((tempToothCurrentCount - 1) * triggerToothAngle) + configPage4.triggerAngle; //Number of teeth that have passed since tooth 1, multiplied by the angle each tooth represents, plus the angle that tooth 1 is ATDC. This gives accuracy only to the nearest tooth.
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -552,11 +552,11 @@ int getCrankAngle_BasicDistributor(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
int crankAngle = ((tempToothCurrentCount - 1) * triggerToothAngle) + configPage4.triggerAngle; //Number of teeth that have passed since tooth 1, multiplied by the angle each tooth represents, plus the angle that tooth 1 is ATDC. This gives accuracy only to the nearest tooth.
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -637,6 +637,7 @@ int getCrankAngle_GM7X(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
//Check if the last tooth seen was the reference tooth (Number 3). All others can be calculated, but tooth 3 has a unique angle
@ -655,7 +656,6 @@ int getCrankAngle_GM7X(int timePerDegree)
}
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -964,12 +964,12 @@ int getCrankAngle_4G63(int timePerDegree)
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
tempToothLastMinusOneToothTime = toothLastMinusOneToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
crankAngle = toothAngles[(tempToothCurrentCount - 1)] + configPage4.triggerAngle; //Perform a lookup of the fixed toothAngles array to find what the angle of the last tooth passed was.
//Estimate the number of degrees travelled since the last tooth}
unsigned long elapsedTime = micros() - tempToothLastToothTime;
//Estimate the number of degrees travelled since the last tooth}
//crankAngle += uSToDegrees(elapsedTime);
unsigned long toothTime = tempToothLastToothTime - tempToothLastMinusOneToothTime;
crankAngle += int((elapsedTime * triggerToothAngle) / toothTime);
@ -1027,7 +1027,6 @@ void triggerSetup_24X()
MAX_STALL_TIME = (3333UL * triggerToothAngle); //Minimum 50rpm. (3333uS is the time per degree at 50rpm)
if(initialisationComplete == false) { toothCurrentCount = 25; toothLastToothTime = micros(); } //Set a startup value here to avoid filter errors when starting. This MUST have the initi check to prevent the fuel pump just staying on all the time
//We set the initial tooth value to be something that should never be reached. This indicates no sync
secondDerivEnabled = false;
decoderIsSequential = true;
}
@ -1084,19 +1083,19 @@ int getCrankAngle_24X(int timePerDegree)
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
tempRevolutionOne = revolutionOne;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
int crankAngle;
if (toothCurrentCount == 0) { crankAngle = 0 + configPage4.triggerAngle; } //This is the special case to handle when the 'last tooth' seen was the cam tooth. 0 is the angle at which the crank tooth goes high (Within 360 degrees).
if (tempToothCurrentCount == 0) { crankAngle = 0 + configPage4.triggerAngle; } //This is the special case to handle when the 'last tooth' seen was the cam tooth. 0 is the angle at which the crank tooth goes high (Within 360 degrees).
else { crankAngle = toothAngles[(tempToothCurrentCount - 1)] + configPage4.triggerAngle;} //Perform a lookup of the fixed toothAngles array to find what the angle of the last tooth passed was.
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
//Sequential check (simply sets whether we're on the first or 2nd revoltuion of the cycle)
if (tempRevolutionOne) { crankAngle += 360; }
if (tempRevolutionOne == 1) { crankAngle += 360; }
if (crankAngle >= 720) { crankAngle -= 720; }
if (crankAngle > CRANK_ANGLE_MAX) { crankAngle -= CRANK_ANGLE_MAX; }
@ -1134,7 +1133,7 @@ void triggerSetup_Jeep2000()
toothAngles[11] = 474;
MAX_STALL_TIME = (3333UL * 60); //Minimum 50rpm. (3333uS is the time per degree at 50rpm). Largest gap between teeth is 60 degrees.
toothCurrentCount = 13; //We set the initial tooth value to be something that should never be reached. This indicates no sync
if(initialisationComplete == false) { toothCurrentCount = 13; toothLastToothTime = micros(); } //Set a startup value here to avoid filter errors when starting. This MUST have the initi check to prevent the fuel pump just staying on all the time
secondDerivEnabled = false;
decoderIsSequential = false;
}
@ -1189,13 +1188,14 @@ int getCrankAngle_Jeep2000(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
int crankAngle;
if (toothCurrentCount == 0) { crankAngle = 146 + configPage4.triggerAngle; } //This is the special case to handle when the 'last tooth' seen was the cam tooth. 146 is the angle at which the crank tooth goes high.
else { crankAngle = toothAngles[(tempToothCurrentCount - 1)] + configPage4.triggerAngle;} //Perform a lookup of the fixed toothAngles array to find what the angle of the last tooth passed was.
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -1303,6 +1303,7 @@ int getCrankAngle_Audi135(int timePerDegree)
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
tempRevolutionOne = revolutionOne;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
//Handle case where the secondary tooth was the last one seen
@ -1310,7 +1311,6 @@ int getCrankAngle_Audi135(int timePerDegree)
int crankAngle = ((tempToothCurrentCount - 1) * triggerToothAngle) + configPage4.triggerAngle; //Number of teeth that have passed since tooth 1, multiplied by the angle each tooth represents, plus the angle that tooth 1 is ATDC. This gives accuracy only to the nearest tooth.
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -1397,6 +1397,7 @@ int getCrankAngle_HondaD17(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
//Check if the last tooth seen was the reference tooth 13 (Number 0 here). All others can be calculated, but tooth 3 has a unique angle
@ -1411,7 +1412,6 @@ int getCrankAngle_HondaD17(int timePerDegree)
}
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -1442,7 +1442,7 @@ void triggerSetup_Miata9905()
decoderIsSequential = true;
triggerActualTeeth = 8;
if(initialisationComplete == false) { secondaryToothCount = 0;toothLastToothTime = micros(); } //Set a startup value here to avoid filter errors when starting. This MUST have the initi check to prevent the fuel pump just staying on all the time
if(initialisationComplete == false) { secondaryToothCount = 0; toothLastToothTime = micros(); } //Set a startup value here to avoid filter errors when starting. This MUST have the initi check to prevent the fuel pump just staying on all the time
else { toothLastToothTime = 0; }
toothLastMinusOneToothTime = 0;
@ -1503,7 +1503,7 @@ void triggerPri_Miata9905()
addToothLogEntry(curGap);
//Whilst this is an uneven tooth pattern, if the specific angle between the last 2 teeth is specified, 1st deriv prediction can be used
if( (configPage4.triggerFilter == 1) )
if( (configPage4.triggerFilter == 1) || (currentStatus.RPM < 1400) )
{
//Lite filter
if( (toothCurrentCount == 1) || (toothCurrentCount == 3) || (toothCurrentCount == 5) || (toothCurrentCount == 7) ) { triggerToothAngle = 70; triggerFilterTime = curGap; } //Trigger filter is set to whatever time it took to do 70 degrees (Next trigger is 110 degrees away)
@ -1535,9 +1535,9 @@ void triggerPri_Miata9905()
toothLastMinusOneToothTime = toothLastToothTime;
toothLastToothTime = curTime;
if ( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) && configPage4.ignCranklock)
//if ( BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) && configPage4.ignCranklock)
if ( (currentStatus.RPM < (currentStatus.crankRPM + 50)) && configPage4.ignCranklock)
{
//This operates in waasted spark mode during cranking to align with crank teeth
if( (toothCurrentCount == 1) || (toothCurrentCount == 5) ) { endCoil1Charge(); endCoil3Charge(); }
else if( (toothCurrentCount == 3) || (toothCurrentCount == 7) ) { endCoil2Charge(); endCoil4Charge(); }
}
@ -1585,6 +1585,7 @@ uint16_t getRPM_Miata9905()
toothTime = toothTime * 36;
tempRPM = ((unsigned long)tempToothAngle * 6000000UL) / toothTime;
revolutionTime = (10UL * toothTime) / tempToothAngle;
MAX_STALL_TIME = 366667UL; // 50RPM
}
}
else
@ -1610,12 +1611,12 @@ int getCrankAngle_Miata9905(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
crankAngle = toothAngles[(tempToothCurrentCount - 1)] + configPage4.triggerAngle; //Perform a lookup of the fixed toothAngles array to find what the angle of the last tooth passed was.
//Estimate the number of degrees travelled since the last tooth}
unsigned long elapsedTime = micros() - tempToothLastToothTime;
//Estimate the number of degrees travelled since the last tooth}
crankAngle += uSToDegrees(elapsedTime);
if (crankAngle >= 720) { crankAngle -= 720; }
@ -1763,12 +1764,12 @@ int getCrankAngle_MazdaAU(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
crankAngle = toothAngles[(tempToothCurrentCount - 1)] + configPage4.triggerAngle; //Perform a lookup of the fixed toothAngles array to find what the angle of the last tooth passed was.
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
//Estimate the number of degrees travelled since the last tooth}
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -1832,6 +1833,7 @@ int getCrankAngle_non360(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
//Handle case where the secondary tooth was the last one seen
@ -1842,7 +1844,6 @@ int getCrankAngle_non360(int timePerDegree)
crankAngle = (crankAngle / configPage4.TrigAngMul) + configPage4.triggerAngle; //Have to divide by the multiplier to get back to actual crank angle.
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -2039,11 +2040,12 @@ int getCrankAngle_Nissan360(int timePerDegree)
tempToothLastToothTime = toothLastToothTime;
tempToothLastMinusOneToothTime = toothLastMinusOneToothTime;
tempToothCurrentCount = toothCurrentCount;
unsigned long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
crankAngle = ( (tempToothCurrentCount - 1) * 2) + configPage4.triggerAngle;
unsigned long halfTooth = (tempToothLastToothTime - tempToothLastMinusOneToothTime) >> 1;
if ( (micros() - tempToothLastToothTime) > halfTooth)
if (elapsedTime > halfTooth)
{
//Means we're over halfway to the next tooth, so add on 1 degree
crankAngle += 1;
@ -2202,12 +2204,12 @@ int getCrankAngle_Subaru67(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
crankAngle = toothAngles[(tempToothCurrentCount - 1)] + configPage4.triggerAngle; //Perform a lookup of the fixed toothAngles array to find what the angle of the last tooth passed was.
//Estimate the number of degrees travelled since the last tooth}
unsigned long elapsedTime = micros() - tempToothLastToothTime;
//Estimate the number of degrees travelled since the last tooth}
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -2307,11 +2309,11 @@ void triggerPri_Daihatsu()
//Aim for tooth times less than about 60 degrees
if(configPage2.nCylinders == 3)
{
targetTime = (toothLastToothTime - toothLastMinusOneToothTime) >> 2; //Teeth are 240 degrees apart for 3 cylinder. 240/3 = 60
targetTime = (toothLastToothTime - toothLastMinusOneToothTime) / 4; //Teeth are 240 degrees apart for 3 cylinder. 240/4 = 60
}
else
{
targetTime = ((toothLastToothTime - toothLastMinusOneToothTime) * 3) >> 4; //Teeth are 180 degrees apart for 4 cylinder. (180*3)/8 = 67
targetTime = ((toothLastToothTime - toothLastMinusOneToothTime) * 3) / 8; //Teeth are 180 degrees apart for 4 cylinder. (180*3)/8 = 67
}
if(curGap < targetTime)
{
@ -2366,11 +2368,12 @@ int getCrankAngle_Daihatsu(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
crankAngle = toothAngles[tempToothCurrentCount-1] + configPage4.triggerAngle; //Crank angle of the last tooth seen
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if(elapsedTime < SHRT_MAX ) { crankAngle += div((int)elapsedTime, timePerDegree).quot; } //This option is much faster, but only available for smaller values of elapsedTime
else { crankAngle += ldiv(elapsedTime, timePerDegree).quot; }
@ -2495,6 +2498,7 @@ int getCrankAngle_Harley(int timePerDegree)
noInterrupts();
tempToothCurrentCount = toothCurrentCount;
tempToothLastToothTime = toothLastToothTime;
long elapsedTime = (micros() - tempToothLastToothTime); //micros() is no longer interrupt safe
interrupts();
//Check if the last tooth seen was the reference tooth (Number 3). All others can be calculated, but tooth 3 has a unique angle
@ -2508,7 +2512,6 @@ int getCrankAngle_Harley(int timePerDegree)
}
//Estimate the number of degrees travelled since the last tooth}
long elapsedTime = micros() - tempToothLastToothTime;
if (elapsedTime < SHRT_MAX ) {
crankAngle += div((int)elapsedTime, timePerDegree).quot; //This option is much faster, but only available for smaller values of elapsedTime
}

View File

@ -12,17 +12,23 @@
#define BOARD_NR_GPIO_PINS 62
#define LED_BUILTIN 13
#define CORE_AVR
//#define TIMER5_MICROS
#elif defined(CORE_TEENSY)
#define BOARD_DIGITAL_GPIO_PINS 34
#define BOARD_NR_GPIO_PINS 34
#elif defined(STM32_MCU_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__STM32F1__) || defined(STM32F4) || defined(STM32)
#define CORE_STM32
#define word(h, l) ((h << 8) | l) //word() function not defined for this platform in the main library
#ifndef word
#define word(h, l) ((h << 8) | l) //word() function not defined for this platform in the main library
#endif
#if defined (STM32F1) || defined(__STM32F1__)
#define BOARD_DIGITAL_GPIO_PINS 34
#undef BOARD_NR_GPIO_PINS //This is declared as 49 in .../framework-arduinoststm32/STM32F1/variants/generic_stm32f103r8/board/board.h
#define BOARD_NR_GPIO_PINS 34
#define LED_BUILTIN 33
#ifndef LED_BUILTIN
#define LED_BUILTIN PB1 //Maple Mini
#endif
#elif defined(ARDUINO_BLACK_F407VE) || defined(STM32F4)
#define BOARD_DIGITAL_GPIO_PINS 80
#define BOARD_NR_GPIO_PINS 80
@ -30,19 +36,17 @@
#endif
//Specific mode for Bluepill due to its small flash size. This disables a number of strings from being compiled into the flash
#if defined(MCU_STM32F103C8)
#if defined(MCU_STM32F103C8) | defined(MCU_STM32F103CB)
#define SMALL_FLASH_MODE
#endif
extern "C" char* sbrk(int incr); //Used to freeRam
inline unsigned char digitalPinToInterrupt(unsigned char Interrupt_pin) { return Interrupt_pin; } //This isn't included in the stm32duino libs (yet)
#if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core
inline unsigned char digitalPinToInterrupt(unsigned char Interrupt_pin) { return Interrupt_pin; } //This isn't included in the stm32duino libs (yet)
#define portOutputRegister(port) (volatile byte *)( &(port->ODR) )
#define portInputRegister(port) (volatile byte *)( &(port->IDR) )
#else //libmaple core aka STM32DUINO
//These are defined in STM32F1/variants/generic_stm32f103c/variant.h but return a non byte* value
#undef portOutputRegister
#undef portInputRegister
#define portOutputRegister(port) (volatile byte *)( &(port->regs->ODR) )
#define portInputRegister(port) (volatile byte *)( &(port->regs->IDR) )
#endif
@ -55,6 +59,8 @@
#define BIT_CLEAR(a,b) ((a) &= ~(1<<(b)))
#define BIT_CHECK(var,pos) !!((var) & (1<<(pos)))
#define interruptSafe(c) noInterrupts(); c interrupts(); //Wraps any code between nointerrupt and interrupt calls
#define MS_IN_MINUTE 60000
#define US_IN_MINUTE 60000000
@ -217,6 +223,12 @@ volatile byte *inj4_pin_port;
volatile byte inj4_pin_mask;
volatile byte *inj5_pin_port;
volatile byte inj5_pin_mask;
volatile byte *inj6_pin_port;
volatile byte inj6_pin_mask;
volatile byte *inj7_pin_port;
volatile byte inj7_pin_mask;
volatile byte *inj8_pin_port;
volatile byte inj8_pin_mask;
volatile byte *ign1_pin_port;
volatile byte ign1_pin_mask;
@ -228,6 +240,12 @@ volatile byte *ign4_pin_port;
volatile byte ign4_pin_mask;
volatile byte *ign5_pin_port;
volatile byte ign5_pin_mask;
volatile byte *ign6_pin_port;
volatile byte ign6_pin_mask;
volatile byte *ign7_pin_port;
volatile byte ign7_pin_mask;
volatile byte *ign8_pin_port;
volatile byte ign8_pin_mask;
volatile byte *tach_pin_port;
volatile byte tach_pin_mask;
@ -256,6 +274,8 @@ int ignition4EndAngle = 0;
//This is used across multiple files
unsigned long revolutionTime; //The time in uS that one revolution would take at current speed (The time tooth 1 was last seen, minus the time it was seen prior to that)
volatile unsigned long timer5_overflow_count = 0; //Increments every time counter 5 overflows. Used for the fast version of micros()
volatile unsigned long ms_counter = 0; //A counter that increments once per ms
//This needs to be here because using the config page directly can prevent burning the setting
byte resetControl = RESET_CONTROL_DISABLED;
@ -691,7 +711,7 @@ struct config10 {
uint8_t flexAdvAdj[6]; //Additional advance (in degrees) @ current ethanol (typically 0 @ 0%, 10-20 @ 100%)
//And another three corn rows die.
byte unused11_75_192[117];
byte unused11_75_191[117];
#if defined(CORE_AVR)
};

View File

@ -78,9 +78,6 @@ void initialiseIdle()
NVIC_ENABLE_IRQ(IRQ_FTM2);
}
#elif defined(CORE_STM32)
Timer1.attachInterrupt(4, idleInterrupt);
Timer1.resume();
#endif
//Initialising comprises of setting the 2D tables with the relevant values from the config pages
@ -196,6 +193,11 @@ void initialiseIdle()
}
idleInitComplete = configPage6.iacAlgorithm; //Sets which idle method was initialised
currentStatus.idleLoad = 0;
#if defined(CORE_STM32) //Need to be initialised last due to instant interrupt
Timer1.setMode(4, TIMER_OUTPUT_COMPARE);
if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid
Timer1.resume();
#endif
}
void idleControl()
@ -319,7 +321,7 @@ static inline byte isStepperHomed()
digitalWrite(pinStepperDir, STEPPER_BACKWARD); //Sets stepper direction to backwards
digitalWrite(pinStepperEnable, LOW); //Enable the DRV8825
digitalWrite(pinStepperStep, HIGH);
idleStepper.stepStartTime = micros();
idleStepper.stepStartTime = micros_safe();
idleStepper.stepperStatus = STEPPING;
completedHomeSteps++;
idleOn = true;
@ -339,13 +341,13 @@ static inline byte checkForStepping()
bool isStepping = false;
if( (idleStepper.stepperStatus == STEPPING) || (idleStepper.stepperStatus == COOLING) )
{
if(micros() > (idleStepper.stepStartTime + iacStepTime) )
if(micros_safe() > (idleStepper.stepStartTime + iacStepTime) )
{
if(idleStepper.stepperStatus == STEPPING)
{
//Means we're currently in a step, but it needs to be turned off
digitalWrite(pinStepperStep, LOW); //Turn off the step
idleStepper.stepStartTime = micros();
idleStepper.stepStartTime = micros_safe();
idleStepper.stepperStatus = COOLING; //'Cooling' is the time the stepper needs to sit in LOW state before the next step can be made
isStepping = true;
}
@ -377,7 +379,7 @@ static inline void doStep()
digitalWrite(pinStepperEnable, LOW); //Enable the DRV8825
digitalWrite(pinStepperStep, HIGH);
idleStepper.stepStartTime = micros();
idleStepper.stepStartTime = micros_safe();
idleStepper.stepperStatus = STEPPING;
idleOn = true;
}
@ -459,3 +461,4 @@ static inline void idleInterrupt() //Most ARM chips can simply call a function
}
}

View File

@ -16,8 +16,14 @@ unsigned long percentage(byte, unsigned long);
//This is a dedicated function that specifically handles the case of mapping 0-1023 values into a 0 to X range
//This is a common case because it means converting from a standard 10-bit analog input to a byte or 10-bit analog into 0-511 (Eg the temperature readings)
#define fastMap1023toX(x, out_max) ( ((unsigned long)x * out_max) >> 10)
//This is a new version that allows for out_min
#define fastMap10Bit(x, out_min, out_max) ( ( ((unsigned long)x * (out_max-out_min)) >> 10 ) + out_min)
#if defined(_VARIANT_ARDUINO_STM32_) //libmaple
#define fastMap1023toX(x, out_max) ( ((unsigned long)x * out_max) >> 12)
//This is a new version that allows for out_min
#define fastMap10Bit(x, out_min, out_max) ( ( ((unsigned long)x * (out_max-out_min)) >> 12 ) + out_min)
#else
#define fastMap1023toX(x, out_max) ( ((unsigned long)x * out_max) >> 10)
//This is a new version that allows for out_min
#define fastMap10Bit(x, out_min, out_max) ( ( ((unsigned long)x * (out_max-out_min)) >> 10 ) + out_min)
#endif
#endif

View File

@ -1,6 +1,9 @@
#ifndef SCHEDULEDIO_H
#define SCHEDULEDIO_H
//If coil inverse is on, set the output low, else set it high
//#define beginCoil1Charge() { configPage4.IgInv == 1 ? *ign1_pin_port &= ~(ign1_pin_mask); : *ign1_pin_port |= (ign1_pin_mask); } TACH_PULSE_LOW();
inline void beginCoil1Charge();
inline void endCoil1Charge();
@ -16,6 +19,15 @@ inline void endCoil4Charge();
inline void beginCoil5Charge();
inline void endCoil5Charge();
inline void beginCoil6Charge();
inline void endCoil6Charge();
inline void beginCoil7Charge();
inline void endCoil7Charge();
inline void beginCoil8Charge();
inline void endCoil8Charge();
//The following functions are used specifically for the trailing coil on rotary engines. They are separate as they also control the switching of the trailing select pin
inline void beginTrailingCoilCharge();
inline void endTrailingCoilCharge1();

View File

@ -20,6 +20,15 @@ volatile bool tachoAlt = true;
inline void beginCoil5Charge() { digitalWrite(pinCoil5, coilHIGH); TACH_PULSE_LOW(); }
inline void endCoil5Charge() { digitalWrite(pinCoil5, coilLOW); TACH_PULSE_HIGH(); }
inline void beginCoil6Charge() { digitalWrite(pinCoil6, coilHIGH); TACH_PULSE_LOW(); }
inline void endCoil6Charge() { digitalWrite(pinCoil6, coilLOW); TACH_PULSE_HIGH(); }
inline void beginCoil7Charge() { digitalWrite(pinCoil7, coilHIGH); TACH_PULSE_LOW(); }
inline void endCoil7Charge() { digitalWrite(pinCoil7, coilLOW); TACH_PULSE_HIGH(); }
inline void beginCoil8Charge() { digitalWrite(pinCoil8, coilHIGH); TACH_PULSE_LOW(); }
inline void endCoil8Charge() { digitalWrite(pinCoil8, coilLOW); TACH_PULSE_HIGH(); }
inline void beginTrailingCoilCharge() { digitalWrite(pinCoil2, coilHIGH); }
inline void endTrailingCoilCharge1() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port |= ign3_pin_mask; } //Sets ign3 (Trailing select) high
inline void endTrailingCoilCharge2() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port &= ~(ign3_pin_mask); } //sets ign3 (Trailing select) low

View File

@ -35,18 +35,16 @@ See page 136 of the processors datasheet: http://www.atmel.com/Images/doc2549.pd
#define FUEL2_COUNTER TCNT3
#define FUEL3_COUNTER TCNT3
#define FUEL4_COUNTER TCNT4
#define FUEL5_COUNTER TCNT3
//The following are for the additional dynamic modes and share the counter and compares with the ignition
#define FUEL6_COUNTER TCNT4 //Takes off ignition 4
#define FUEL7_COUNTER TCNT5
#define FUEL8_COUNTER TCNT5
#define FUEL5_COUNTER TCNT1
#define FUEL6_COUNTER TCNT4 //Replaces ignition 4
#define FUEL7_COUNTER TCNT5 //Replaces ignition 3
#define FUEL8_COUNTER TCNT5 //Replaces ignition 2
#define IGN1_COUNTER TCNT5
#define IGN2_COUNTER TCNT5
#define IGN3_COUNTER TCNT5
#define IGN4_COUNTER TCNT4
#define IGN5_COUNTER TCNT1
//The following are for the additional dynamic modes and share the counter and compares with the injectors
#define IGN6_COUNTER TCNT4 //Replaces injector 4
#define IGN7_COUNTER TCNT3 //Replaces injector 3
#define IGN8_COUNTER TCNT3 //Replaces injector 2
@ -55,8 +53,7 @@ See page 136 of the processors datasheet: http://www.atmel.com/Images/doc2549.pd
#define FUEL2_COMPARE OCR3B
#define FUEL3_COMPARE OCR3C
#define FUEL4_COMPARE OCR4B
#define FUEL5_COMPARE OCR3A //Shared with FUEL1
//The following are for the additional dynamic modes and share the counter and compares with the ignition
#define FUEL5_COMPARE OCR1C //Shared with FUEL1
#define FUEL6_COMPARE OCR4A //Replaces ignition4
#define FUEL7_COMPARE OCR5C //Replaces ignition3
#define FUEL8_COMPARE OCR5B //Replaces ignition2
@ -66,7 +63,6 @@ See page 136 of the processors datasheet: http://www.atmel.com/Images/doc2549.pd
#define IGN3_COMPARE OCR5C
#define IGN4_COMPARE OCR4A
#define IGN5_COMPARE OCR1C
//The following are for the additional dynamic modes and share the counter and compares with the injectors
#define IGN6_COMPARE OCR4B //Replaces injector 4
#define IGN7_COMPARE OCR3C //Replaces injector 3
#define IGN8_COMPARE OCR3B //Replaces injector 2
@ -75,19 +71,19 @@ See page 136 of the processors datasheet: http://www.atmel.com/Images/doc2549.pd
#define FUEL2_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3B) //Turn on the B compare unit (ie turn on the interrupt)
#define FUEL3_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3C) //Turn on the C compare unit (ie turn on the interrupt)
#define FUEL4_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4B) //Turn on the B compare unit (ie turn on the interrupt)
#define FUEL5_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3B) //
#define FUEL6_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3B) //
#define FUEL7_TIMER_ENABLE() TIMSK3 |= (1 << OCIE3C) //
#define FUEL8_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4B) //
#define FUEL5_TIMER_ENABLE() TIMSK1 |= (1 << OCIE1C) //
#define FUEL6_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4A) //
#define FUEL7_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5C) //
#define FUEL8_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5B) //
#define FUEL1_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3A); //Turn off this output compare unit
#define FUEL2_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3B); //Turn off this output compare unit
#define FUEL3_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3C); //Turn off this output compare unit
#define FUEL4_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4B); //Turn off this output compare unit
#define FUEL5_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3A); //
#define FUEL6_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3B); //
#define FUEL7_TIMER_DISABLE() TIMSK3 &= ~(1 << OCIE3C); //
#define FUEL8_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4B); //
#define FUEL5_TIMER_DISABLE() TIMSK1 &= ~(1 << OCIE1C); //
#define FUEL6_TIMER_DISABLE() TIMSK4 &= ~(1 << OCIE4A); //
#define FUEL7_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5C); //
#define FUEL8_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5B); //
#define IGN1_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5A) //Turn on the A compare unit (ie turn on the interrupt)
#define IGN2_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5B) //Turn on the B compare unit (ie turn on the interrupt)
@ -204,138 +200,169 @@ See page 136 of the processors datasheet: http://www.atmel.com/Images/doc2549.pd
#define FUEL2_COUNTER (TIM2)->CNT
#define FUEL3_COUNTER (TIM2)->CNT
#define FUEL4_COUNTER (TIM2)->CNT
#define FUEL5_COUNTER (TIM4)->CNT
#define FUEL6_COUNTER (TIM4)->CNT
#define FUEL7_COUNTER (TIM4)->CNT
#define FUEL8_COUNTER (TIM4)->CNT
#define IGN1_COUNTER (TIM3)->CNT
#define IGN2_COUNTER (TIM3)->CNT
#define IGN3_COUNTER (TIM3)->CNT
#define IGN4_COUNTER (TIM3)->CNT
#define IGN5_COUNTER (TIM4)->CNT
#define IGN6_COUNTER (TIM4)->CNT
#define IGN7_COUNTER (TIM4)->CNT
#define IGN8_COUNTER (TIM4)->CNT
#define FUEL1_COMPARE (TIM2)->CCR1
#define FUEL2_COMPARE (TIM2)->CCR2
#define FUEL3_COMPARE (TIM2)->CCR3
#define FUEL4_COMPARE (TIM2)->CCR4
#define FUEL5_COMPARE (TIM4)->CCR1
#define FUEL6_COMPARE (TIM4)->CCR2
#define FUEL7_COMPARE (TIM4)->CCR3
#define FUEL8_COMPARE (TIM4)->CCR4
#define IGN1_COUNTER (TIM3)->CNT
#define IGN2_COUNTER (TIM3)->CNT
#define IGN3_COUNTER (TIM3)->CNT
#define IGN4_COUNTER (TIM3)->CNT
#define IGN1_COMPARE (TIM3)->CCR1
#define IGN2_COMPARE (TIM3)->CCR2
#define IGN3_COMPARE (TIM3)->CCR3
#define IGN4_COMPARE (TIM3)->CCR4
#ifndef SMALL_FLASH_MODE
#define FUEL5_COUNTER (TIM5)->CNT
#define FUEL6_COUNTER (TIM5)->CNT
#define FUEL7_COUNTER (TIM5)->CNT
#define FUEL8_COUNTER (TIM5)->CNT
#define FUEL5_COMPARE (TIM5)->CCR1
#define FUEL6_COMPARE (TIM5)->CCR2
#define FUEL7_COMPARE (TIM5)->CCR3
#define FUEL8_COMPARE (TIM5)->CCR4
#define IGN5_COUNTER (TIM4)->CNT
#define IGN6_COUNTER (TIM4)->CNT
#define IGN7_COUNTER (TIM4)->CNT
#define IGN8_COUNTER (TIM4)->CNT
#define IGN5_COMPARE (TIM4)->CCR1
#define IGN6_COMPARE (TIM4)->CCR2
#define IGN7_COMPARE (TIM4)->CCR3
#define IGN8_COMPARE (TIM4)->CCR4
#endif
//https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444
#define FUEL1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E
#define FUEL2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E
#define FUEL3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E
#define FUEL4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E
#define FUEL5_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC1E
#define FUEL6_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC2E
#define FUEL7_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC3E
#define FUEL8_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC4E
#define IGN1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E
#define IGN2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E
#define IGN3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E
#define IGN4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E
#define IGN5_TIMER_ENABLE() (TIM1)->CCER |= TIM_CCER_CC1E
#define FUEL1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E
#define FUEL2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E
#define FUEL3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E
#define FUEL4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E
#define IGN1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E
#define IGN2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E
#define IGN3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E
#define IGN4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E
#define IGN1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E
#define IGN2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E
#define IGN3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E
#define IGN4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E
#define IGN5_TIMER_DISABLE() (TIM1)->CCER &= ~TIM_CCER_CC1E
#ifndef SMALL_FLASH_MODE
#define FUEL5_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC1E
#define FUEL6_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC2E
#define FUEL7_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC3E
#define FUEL8_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC4E
#define FUEL5_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC1E
#define FUEL6_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC2E
#define FUEL7_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC3E
#define FUEL8_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC4E
#define IGN5_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC1E
#define IGN6_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC2E
#define IGN7_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC3E
#define IGN8_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC4E
#define IGN5_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC1E
#define IGN6_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC2E
#define IGN7_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC3E
#define IGN8_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC4E
#endif
#else //libmaple core aka STM32DUINO
#define FUEL1_COUNTER (TIMER2->regs).gen->CNT
#define FUEL2_COUNTER (TIMER2->regs).gen->CNT
#define FUEL3_COUNTER (TIMER2->regs).gen->CNT
#define FUEL4_COUNTER (TIMER2->regs).gen->CNT
#define FUEL5_COUNTER (TIMER4->regs).gen->CNT
#define FUEL6_COUNTER (TIMER4->regs).gen->CNT
#define FUEL7_COUNTER (TIMER4->regs).gen->CNT
#define FUEL8_COUNTER (TIMER4->regs).gen->CNT
#define IGN1_COUNTER (TIMER3->regs).gen->CNT
#define IGN2_COUNTER (TIMER3->regs).gen->CNT
#define IGN3_COUNTER (TIMER3->regs).gen->CNT
#define IGN4_COUNTER (TIMER3->regs).gen->CNT
#define IGN5_COUNTER (TIMER4->regs).gen->CNT
#define IGN6_COUNTER (TIMER4->regs).gen->CNT
#define IGN7_COUNTER (TIMER4->regs).gen->CNT
#define IGN8_COUNTER (TIMER4->regs).gen->CNT
#define FUEL1_COMPARE (TIMER2->regs).gen->CCR1
#define FUEL2_COMPARE (TIMER2->regs).gen->CCR2
#define FUEL3_COMPARE (TIMER2->regs).gen->CCR3
#define FUEL4_COMPARE (TIMER2->regs).gen->CCR4
#define FUEL5_COMPARE (TIMER4->regs).gen->CCR1
#define FUEL6_COMPARE (TIMER4->regs).gen->CCR2
#define FUEL7_COMPARE (TIMER4->regs).gen->CCR3
#define FUEL8_COMPARE (TIMER4->regs).gen->CCR4
#define IGN1_COUNTER (TIMER3->regs).gen->CNT
#define IGN2_COUNTER (TIMER3->regs).gen->CNT
#define IGN3_COUNTER (TIMER3->regs).gen->CNT
#define IGN4_COUNTER (TIMER3->regs).gen->CNT
#define IGN1_COMPARE (TIMER3->regs).gen->CCR1
#define IGN2_COMPARE (TIMER3->regs).gen->CCR2
#define IGN3_COMPARE (TIMER3->regs).gen->CCR3
#define IGN4_COMPARE (TIMER3->regs).gen->CCR4
#ifndef SMALL_FLASH_MODE
#define FUEL5_COUNTER (TIMER5->regs).gen->CNT
#define FUEL6_COUNTER (TIMER5->regs).gen->CNT
#define FUEL7_COUNTER (TIMER5->regs).gen->CNT
#define FUEL8_COUNTER (TIMER5->regs).gen->CNT
#define FUEL5_COMPARE (TIMER5->regs).gen->CCR1
#define FUEL6_COMPARE (TIMER5->regs).gen->CCR2
#define FUEL7_COMPARE (TIMER5->regs).gen->CCR3
#define FUEL8_COMPARE (TIMER5->regs).gen->CCR4
#define IGN5_COUNTER (TIMER4->regs).gen->CNT
#define IGN6_COUNTER (TIMER4->regs).gen->CNT
#define IGN7_COUNTER (TIMER4->regs).gen->CNT
#define IGN8_COUNTER (TIMER4->regs).gen->CNT
#define IGN5_COMPARE (TIMER4->regs).gen->CCR1
#define IGN6_COMPARE (TIMER4->regs).gen->CCR2
#define IGN7_COMPARE (TIMER4->regs).gen->CCR3
#define IGN8_COMPARE (TIMER4->regs).gen->CCR4
#endif
//https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444
#define FUEL1_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC1E
#define FUEL2_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC2E
#define FUEL3_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC3E
#define FUEL4_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC4E
#define FUEL5_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC1E
#define FUEL6_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC2E
#define FUEL7_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC3E
#define FUEL8_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC4E
#define IGN1_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC1E
#define IGN2_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC2E
#define IGN3_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC3E
#define IGN4_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC4E
#define IGN5_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC1E
#define IGN6_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC2E
#define IGN7_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC3E
#define IGN8_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC4E
#define FUEL1_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC1E
#define FUEL2_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC2E
#define FUEL3_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC3E
#define FUEL4_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC4E
#define FUEL5_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC1E
#define FUEL6_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC2E
#define FUEL7_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC3E
#define FUEL8_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC4E
#define IGN1_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC1E
#define IGN2_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC2E
#define IGN3_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC3E
#define IGN4_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC4E
#define IGN1_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC1E
#define IGN2_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC2E
#define IGN3_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC3E
#define IGN4_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC4E
#ifndef SMALL_FLASH_MODE
#define FUEL5_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC1E
#define FUEL6_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC2E
#define FUEL7_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC3E
#define FUEL8_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC4E
#define IGN5_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC1E
#define IGN6_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC2E
#define IGN7_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC3E
#define IGN8_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC4E
#define FUEL5_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC1E
#define FUEL6_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC2E
#define FUEL7_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC3E
#define FUEL8_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC4E
#define IGN5_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC1E
#define IGN6_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC2E
#define IGN7_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC3E
#define IGN8_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC4E
#endif
#endif
#endif

View File

@ -21,7 +21,7 @@ void initialiseSchedulers()
TCCR3B = (1 << CS12); //Timer3 Control Reg B: Timer Prescaler set to 256. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg
//TCCR3B = 0x03; //Timer3 Control Reg B: Timer Prescaler set to 64. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg
//Ignition Schedules, which uses timer 5
//Ignition Schedules, which uses timer 5. This is also used by the fast version of micros(). If the speed of this timer is changed from 4uS ticks, that MUST be changed as well. See globals.h and timers.ino
TCCR5B = 0x00; //Disable Timer5 while we set it up
TCNT5 = 0; //Reset Timer Count
TIFR5 = 0x00; //Timer5 INT Flag Reg: Clear Timer Overflow Flag
@ -29,6 +29,11 @@ void initialiseSchedulers()
//TCCR5B = (1 << CS12); //Timer5 Control Reg B: Timer Prescaler set to 256. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg
TCCR5B = 0x03; //aka Divisor = 64 = 490.1Hz
#if defined(TIMER5_MICROS)
TIMSK5 |= (1 << TOIE5); //Enable the timer5 overflow interrupt (See timers.ino for ISR)
TIMSK0 &= ~_BV(TOIE0); // disable timer0 overflow interrupt
#endif
//The remaining Schedules (Schedules 4 for fuel and ignition) use Timer4
TCCR4B = 0x00; //Disable Timer4 while we set it up
TCNT4 = 0; //Reset Timer Count
@ -48,15 +53,15 @@ void initialiseSchedulers()
FTM0_CNT = 0x0000; // Reset the count to zero
FTM0_MOD = 0xFFFF; // max modulus = 65535
//FlexTimer 1 is used for schedules on channel 5+. Currently only channel 5 is used, but will likely be expanded later
FTM1_MODE |= FTM_MODE_WPDIS; // Write Protection Disable
FTM1_MODE |= FTM_MODE_FTMEN; //Flex Timer module enable
FTM1_MODE |= FTM_MODE_INIT;
//FlexTimer 3 is used for schedules on channel 5+. Currently only channel 5 is used, but will likely be expanded later
FTM3_MODE |= FTM_MODE_WPDIS; // Write Protection Disable
FTM3_MODE |= FTM_MODE_FTMEN; //Flex Timer module enable
FTM3_MODE |= FTM_MODE_INIT;
FTM1_SC = 0x00; // Set this to zero before changing the modulus
FTM1_CNTIN = 0x0000; //Shouldn't be needed, but just in case
FTM1_CNT = 0x0000; // Reset the count to zero
FTM1_MOD = 0xFFFF; // max modulus = 65535
FTM3_SC = 0x00; // Set this to zero before changing the modulus
FTM3_CNTIN = 0x0000; //Shouldn't be needed, but just in case
FTM3_CNT = 0x0000; // Reset the count to zero
FTM3_MOD = 0xFFFF; // max modulus = 65535
/*
* Enable the clock for FTM0/1
@ -66,7 +71,7 @@ void initialiseSchedulers()
* 11 External clock
*/
FTM0_SC |= FTM_SC_CLKS(0b1);
FTM1_SC |= FTM_SC_CLKS(0b1);
FTM3_SC |= FTM_SC_CLKS(0b1);
/*
* Set Prescaler
@ -84,7 +89,7 @@ void initialiseSchedulers()
* 111 Divide by 128
*/
FTM0_SC |= FTM_SC_PS(0b111);
FTM1_SC |= FTM_SC_PS(0b111);
FTM3_SC |= FTM_SC_PS(0b111);
//Setup the channels (See Pg 1014 of K64 DS).
//The are probably not needed as power on state should be 0
@ -166,35 +171,33 @@ void initialiseSchedulers()
Timer1.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution
Timer2.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution
Timer3.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution
Timer2.setMode(1, TIMER_OUTPUT_COMPARE);
Timer2.setMode(2, TIMER_OUTPUT_COMPARE);
Timer2.setMode(3, TIMER_OUTPUT_COMPARE);
Timer2.setMode(4, TIMER_OUTPUT_COMPARE);
Timer3.setMode(1, TIMER_OUTPUT_COMPARE);
Timer3.setMode(2, TIMER_OUTPUT_COMPARE);
Timer3.setMode(3, TIMER_OUTPUT_COMPARE);
Timer3.setMode(4, TIMER_OUTPUT_COMPARE);
Timer1.setMode(1, TIMER_OUTPUT_COMPARE);
#else //libmaple core aka STM32DUINO
//see https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444
//(CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz).
//Timer2 to 4 is on APB1, Timer1 on APB2. http://www.st.com/resource/en/datasheet/stm32f103cb.pdf sheet 12
Timer1.setPrescaleFactor((72 * 2U)-1); //2us resolution
Timer2.setPrescaleFactor((36 * 2U)-1); //2us resolution
Timer3.setPrescaleFactor((36 * 2U)-1); //2us resolution
Timer2.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE);
Timer2.setMode(TIMER_CH2, TIMER_OUTPUT_COMPARE);
Timer2.setMode(TIMER_CH3, TIMER_OUTPUT_COMPARE);
Timer2.setMode(TIMER_CH4, TIMER_OUTPUT_COMPARE);
Timer3.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE);
Timer3.setMode(TIMER_CH2, TIMER_OUTPUT_COMPARE);
Timer3.setMode(TIMER_CH3, TIMER_OUTPUT_COMPARE);
Timer3.setMode(TIMER_CH4, TIMER_OUTPUT_COMPARE);
#if defined (STM32F1) || defined(__STM32F1__)
//(CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz).
//Timer2 to 4 is on APB1, Timer1 on APB2. http://www.st.com/resource/en/datasheet/stm32f103cb.pdf sheet 12
Timer1.setPrescaleFactor((72 * 2U)-1); //2us resolution
Timer2.setPrescaleFactor((36 * 2U)-1); //2us resolution
Timer3.setPrescaleFactor((36 * 2U)-1); //2us resolution
#elif defined(STM32F4)
//(CYCLES_PER_MICROSECOND == 168, APB2 at 84MHz, APB1 at 42MHz).
//Timer2 to 14 is on APB1, Timers 1, 8, 9 and 10 on APB2. http://www.st.com/resource/en/datasheet/stm32f407vg.pdf sheet 120
Timer1.setPrescaleFactor((84 * 2U)-1); //2us resolution
Timer2.setPrescaleFactor((42 * 2U)-1); //2us resolution
Timer3.setPrescaleFactor((42 * 2U)-1); //2us resolution
#endif
#endif
Timer2.setMode(1, TIMER_OUTPUT_COMPARE);
Timer2.setMode(2, TIMER_OUTPUT_COMPARE);
Timer2.setMode(3, TIMER_OUTPUT_COMPARE);
Timer2.setMode(4, TIMER_OUTPUT_COMPARE);
Timer3.setMode(1, TIMER_OUTPUT_COMPARE);
Timer3.setMode(2, TIMER_OUTPUT_COMPARE);
Timer3.setMode(3, TIMER_OUTPUT_COMPARE);
Timer3.setMode(4, TIMER_OUTPUT_COMPARE);
Timer1.setMode(1, TIMER_OUTPUT_COMPARE);
Timer2.attachInterrupt(1, fuelSchedule1Interrupt);
Timer2.attachInterrupt(2, fuelSchedule2Interrupt);
Timer2.attachInterrupt(3, fuelSchedule3Interrupt);
@ -243,10 +246,18 @@ void initialiseSchedulers()
fuelSchedule2.counter = &FUEL2_COUNTER;
fuelSchedule3.counter = &FUEL3_COUNTER;
fuelSchedule4.counter = &FUEL4_COUNTER;
#if (INJ_CHANNELS >= 5)
fuelSchedule5.counter = &FUEL5_COUNTER;
fuelSchedule6.counter = &FUEL6_COUNTER;
fuelSchedule7.counter = &FUEL7_COUNTER;
fuelSchedule8.counter = &FUEL8_COUNTER;
#endif
#if (INJ_CHANNELS >= 6)
fuelSchedule5.counter = &FUEL6_COUNTER;
#endif
#if (INJ_CHANNELS >= 7)
fuelSchedule5.counter = &FUEL7_COUNTER;
#endif
#if (INJ_CHANNELS >= 8)
fuelSchedule5.counter = &FUEL8_COUNTER;
#endif
ignitionSchedule1.Status = OFF;
ignitionSchedule2.Status = OFF;
@ -475,6 +486,7 @@ void setFuelSchedule4(unsigned long timeout, unsigned long duration) //Uses time
}
}
#if INJ_CHANNELS >= 5
void setFuelSchedule5(void (*startCallback)(), unsigned long timeout, unsigned long duration, void(*endCallback)())
{
if(fuelSchedule5.Status != RUNNING) //Check that we're not already part way through a schedule
@ -506,6 +518,7 @@ void setFuelSchedule5(void (*startCallback)(), unsigned long timeout, unsigned l
fuelSchedule5.hasNextSchedule = true;
}
}
#endif
#if INJ_CHANNELS >= 6
//This uses timer
@ -563,7 +576,7 @@ void setFuelSchedule7(unsigned long timeout, unsigned long duration)
//The following must be enclosed in the noInterupts block to avoid contention caused if the relevant interrupt fires before the state is fully set
noInterrupts();
fuelSchedule7.startCompare = FUEL7_COUNTER + timeout_timer_compare;
fuelSchedule7.endCompare = fuelSchedule6.startCompare + uS_TO_TIMER_COMPARE(duration);
fuelSchedule7.endCompare = fuelSchedule7.startCompare + uS_TO_TIMER_COMPARE(duration);
FUEL7_COMPARE = fuelSchedule7.startCompare; //Use the C copmare unit of timer 3
fuelSchedule7.Status = PENDING; //Turn this schedule on
fuelSchedule7.schedulesSet++; //Increment the number of times this schedule has been set
@ -767,6 +780,102 @@ void setIgnitionSchedule5(void (*startCallback)(), unsigned long timeout, unsign
IGN5_TIMER_ENABLE();
}
}
void setIgnitionSchedule6(void (*startCallback)(), unsigned long timeout, unsigned long duration, void(*endCallback)())
{
if(ignitionSchedule6.Status != RUNNING) //Check that we're not already part way through a schedule
{
ignitionSchedule6.StartCallback = startCallback; //Name the start callback function
ignitionSchedule6.EndCallback = endCallback; //Name the start callback function
ignitionSchedule6.duration = duration;
//Need to check that the timeout doesn't exceed the overflow
uint16_t timeout_timer_compare;
if (timeout > MAX_TIMER_PERIOD) { timeout_timer_compare = uS_TO_TIMER_COMPARE_SLOW( (MAX_TIMER_PERIOD - 1) ); } // If the timeout is >4x (Each tick represents 4uS) the maximum allowed value of unsigned int (65535), the timer compare value will overflow when appliedcausing erratic behaviour such as erroneous sparking.
else { timeout_timer_compare = uS_TO_TIMER_COMPARE_SLOW(timeout); } //Normal case
noInterrupts();
ignitionSchedule6.startCompare = IGN6_COUNTER + timeout_timer_compare;
ignitionSchedule6.endCompare = ignitionSchedule6.startCompare + uS_TO_TIMER_COMPARE_SLOW(duration);
IGN6_COMPARE = ignitionSchedule6.startCompare;
ignitionSchedule6.Status = PENDING; //Turn this schedule on
ignitionSchedule6.schedulesSet++;
interrupts();
IGN6_TIMER_ENABLE();
}
else
{
//If the schedule is already running, we can set the next schedule so it is ready to go
//This is required in cases of high rpm and high DC where there otherwise would not be enough time to set the schedule
ignitionSchedule6.nextStartCompare = IGN6_COUNTER + uS_TO_TIMER_COMPARE_SLOW(timeout);
ignitionSchedule6.nextEndCompare = ignitionSchedule6.nextStartCompare + uS_TO_TIMER_COMPARE_SLOW(duration);
ignitionSchedule6.hasNextSchedule = true;
}
}
void setIgnitionSchedule7(void (*startCallback)(), unsigned long timeout, unsigned long duration, void(*endCallback)())
{
if(ignitionSchedule7.Status != RUNNING) //Check that we're not already part way through a schedule
{
ignitionSchedule7.StartCallback = startCallback; //Name the start callback function
ignitionSchedule7.EndCallback = endCallback; //Name the start callback function
ignitionSchedule7.duration = duration;
//Need to check that the timeout doesn't exceed the overflow
uint16_t timeout_timer_compare;
if (timeout > MAX_TIMER_PERIOD) { timeout_timer_compare = uS_TO_TIMER_COMPARE_SLOW( (MAX_TIMER_PERIOD - 1) ); } // If the timeout is >4x (Each tick represents 4uS) the maximum allowed value of unsigned int (65535), the timer compare value will overflow when appliedcausing erratic behaviour such as erroneous sparking.
else { timeout_timer_compare = uS_TO_TIMER_COMPARE_SLOW(timeout); } //Normal case
noInterrupts();
ignitionSchedule7.startCompare = IGN4_COUNTER + timeout_timer_compare;
ignitionSchedule7.endCompare = ignitionSchedule7.startCompare + uS_TO_TIMER_COMPARE_SLOW(duration);
IGN7_COMPARE = ignitionSchedule7.startCompare;
ignitionSchedule7.Status = PENDING; //Turn this schedule on
ignitionSchedule7.schedulesSet++;
interrupts();
IGN7_TIMER_ENABLE();
}
else
{
//If the schedule is already running, we can set the next schedule so it is ready to go
//This is required in cases of high rpm and high DC where there otherwise would not be enough time to set the schedule
ignitionSchedule7.nextStartCompare = IGN7_COUNTER + uS_TO_TIMER_COMPARE_SLOW(timeout);
ignitionSchedule7.nextEndCompare = ignitionSchedule7.nextStartCompare + uS_TO_TIMER_COMPARE_SLOW(duration);
ignitionSchedule7.hasNextSchedule = true;
}
}
void setIgnitionSchedule8(void (*startCallback)(), unsigned long timeout, unsigned long duration, void(*endCallback)())
{
if(ignitionSchedule8.Status != RUNNING) //Check that we're not already part way through a schedule
{
ignitionSchedule8.StartCallback = startCallback; //Name the start callback function
ignitionSchedule8.EndCallback = endCallback; //Name the start callback function
ignitionSchedule8.duration = duration;
//Need to check that the timeout doesn't exceed the overflow
uint16_t timeout_timer_compare;
if (timeout > MAX_TIMER_PERIOD) { timeout_timer_compare = uS_TO_TIMER_COMPARE_SLOW( (MAX_TIMER_PERIOD - 1) ); } // If the timeout is >4x (Each tick represents 4uS) the maximum allowed value of unsigned int (65535), the timer compare value will overflow when appliedcausing erratic behaviour such as erroneous sparking.
else { timeout_timer_compare = uS_TO_TIMER_COMPARE_SLOW(timeout); } //Normal case
noInterrupts();
ignitionSchedule8.startCompare = IGN8_COUNTER + timeout_timer_compare;
ignitionSchedule8.endCompare = ignitionSchedule8.startCompare + uS_TO_TIMER_COMPARE_SLOW(duration);
IGN8_COMPARE = ignitionSchedule8.startCompare;
ignitionSchedule8.Status = PENDING; //Turn this schedule on
ignitionSchedule8.schedulesSet++;
interrupts();
IGN8_TIMER_ENABLE();
}
else
{
//If the schedule is already running, we can set the next schedule so it is ready to go
//This is required in cases of high rpm and high DC where there otherwise would not be enough time to set the schedule
ignitionSchedule8.nextStartCompare = IGN8_COUNTER + uS_TO_TIMER_COMPARE_SLOW(timeout);
ignitionSchedule8.nextEndCompare = ignitionSchedule8.nextStartCompare + uS_TO_TIMER_COMPARE_SLOW(duration);
ignitionSchedule8.hasNextSchedule = true;
}
}
/*******************************************************************************************************************************************************************************************************/
//This function (All 8 ISR functions that are below) gets called when either the start time or the duration time are reached
@ -915,6 +1024,39 @@ static inline void fuelSchedule4Interrupt() //Most ARM chips can simply call a f
}
}
#if (INJ_CHANNELS >= 5)
#if defined(CORE_AVR) //AVR chips use the ISR for this
ISR(TIMER1_COMPC_vect) //fuelSchedule5
#elif defined (CORE_TEENSY) || defined(CORE_STM32)
static inline void fuelSchedule5Interrupt() //Most ARM chips can simply call a function
#endif
{
if (fuelSchedule5.Status == PENDING) //Check to see if this schedule is turn on
{
openInjector5();
fuelSchedule5.Status = RUNNING; //Set the status to be in progress (ie The start callback has been called, but not the end callback)
FUEL5_COMPARE = fuelSchedule5.endCompare;
}
else if (fuelSchedule5.Status == RUNNING)
{
closeInjector5();
fuelSchedule5.Status = OFF; //Turn off the schedule
fuelSchedule5.schedulesSet = 0;
//If there is a next schedule queued up, activate it
if(fuelSchedule5.hasNextSchedule == true)
{
FUEL5_COMPARE = fuelSchedule5.nextStartCompare;
fuelSchedule5.endCompare = fuelSchedule5.nextEndCompare;
fuelSchedule5.Status = PENDING;
fuelSchedule5.schedulesSet = 1;
fuelSchedule5.hasNextSchedule = false;
}
else { FUEL5_TIMER_DISABLE(); }
}
}
#endif
#if (INJ_CHANNELS >= 6)
#if defined(CORE_AVR) //AVR chips use the ISR for this
ISR(TIMER4_COMPA_vect) //fuelSchedule6
@ -950,7 +1092,76 @@ static inline void fuelSchedule6Interrupt() //Most ARM chips can simply call a f
}
#endif
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) //AVR chips use the ISR for this
#if (INJ_CHANNELS >= 7)
#if defined(CORE_AVR) //AVR chips use the ISR for this
ISR(TIMER5_COMPC_vect) //fuelSchedule7
#elif defined (CORE_TEENSY) || defined(CORE_STM32)
static inline void fuelSchedule7Interrupt() //Most ARM chips can simply call a function
#endif
{
if (fuelSchedule7.Status == PENDING) //Check to see if this schedule is turn on
{
openInjector7();
fuelSchedule7.Status = RUNNING; //Set the status to be in progress (ie The start callback has been called, but not the end callback)
FUEL7_COMPARE = fuelSchedule7.endCompare;
}
else if (fuelSchedule7.Status == RUNNING)
{
closeInjector7();
fuelSchedule7.Status = OFF; //Turn off the schedule
fuelSchedule7.schedulesSet = 0;
//If there is a next schedule queued up, activate it
if(fuelSchedule7.hasNextSchedule == true)
{
FUEL7_COMPARE = fuelSchedule7.nextStartCompare;
fuelSchedule7.endCompare = fuelSchedule7.nextEndCompare;
fuelSchedule7.Status = PENDING;
fuelSchedule7.schedulesSet = 1;
fuelSchedule7.hasNextSchedule = false;
}
else { FUEL7_TIMER_DISABLE(); }
}
}
#endif
#if (INJ_CHANNELS >= 8)
#if defined(CORE_AVR) //AVR chips use the ISR for this
ISR(TIMER5_COMPB_vect) //fuelSchedule8
#elif defined (CORE_TEENSY) || defined(CORE_STM32)
static inline void fuelSchedule8Interrupt() //Most ARM chips can simply call a function
#endif
{
if (fuelSchedule8.Status == PENDING) //Check to see if this schedule is turn on
{
//fuelSchedule4.StartCallback();
openInjector8();
fuelSchedule8.Status = RUNNING; //Set the status to be in progress (ie The start callback has been called, but not the end callback)
FUEL8_COMPARE = fuelSchedule8.endCompare;
}
else if (fuelSchedule8.Status == RUNNING)
{
//fuelSchedule4.EndCallback();
closeInjector8();
fuelSchedule8.Status = OFF; //Turn off the schedule
fuelSchedule8.schedulesSet = 0;
//If there is a next schedule queued up, activate it
if(fuelSchedule8.hasNextSchedule == true)
{
FUEL8_COMPARE = fuelSchedule8.nextStartCompare;
fuelSchedule8.endCompare = fuelSchedule8.nextEndCompare;
fuelSchedule8.Status = PENDING;
fuelSchedule8.schedulesSet = 1;
fuelSchedule8.hasNextSchedule = false;
}
else { FUEL8_TIMER_DISABLE(); }
}
}
#endif
#if IGN_CHANNELS >= 1
#if defined(CORE_AVR) //AVR chips use the ISR for this
ISR(TIMER5_COMPA_vect) //ignitionSchedule1
#elif defined (CORE_TEENSY) || defined(CORE_STM32)
static inline void ignitionSchedule1Interrupt() //Most ARM chips can simply call a function
@ -988,8 +1199,10 @@ static inline void ignitionSchedule1Interrupt() //Most ARM chips can simply call
IGN1_TIMER_DISABLE();
}
}
#endif
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) //AVR chips use the ISR for this
#if IGN_CHANNELS >= 2
#if defined(CORE_AVR) //AVR chips use the ISR for this
ISR(TIMER5_COMPB_vect) //ignitionSchedule2
#elif defined (CORE_TEENSY) || defined(CORE_STM32)
static inline void ignitionSchedule2Interrupt() //Most ARM chips can simply call a function
@ -1011,8 +1224,10 @@ static inline void ignitionSchedule2Interrupt() //Most ARM chips can simply call
IGN2_TIMER_DISABLE();
}
}
#endif
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) //AVR chips use the ISR for this
#if IGN_CHANNELS >= 3
#if defined(CORE_AVR) //AVR chips use the ISR for this
ISR(TIMER5_COMPC_vect) //ignitionSchedule3
#elif defined (CORE_TEENSY) || defined(CORE_STM32)
static inline void ignitionSchedule3Interrupt() //Most ARM chips can simply call a function
@ -1044,7 +1259,9 @@ static inline void ignitionSchedule3Interrupt() //Most ARM chips can simply call
else { IGN3_TIMER_DISABLE(); }
}
}
#endif
#if IGN_CHANNELS >= 4
#if defined(CORE_AVR) //AVR chips use the ISR for this
ISR(TIMER4_COMPA_vect) //ignitionSchedule4
#elif defined (CORE_TEENSY) || defined(CORE_STM32)
@ -1077,7 +1294,9 @@ static inline void ignitionSchedule4Interrupt() //Most ARM chips can simply call
else { IGN4_TIMER_DISABLE(); }
}
}
#endif
#if IGN_CHANNELS >= 5
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) //AVR chips use the ISR for this
ISR(TIMER1_COMPC_vect) //ignitionSchedule5
#elif defined (CORE_TEENSY) || defined(CORE_STM32)
@ -1100,7 +1319,7 @@ static inline void ignitionSchedule5Interrupt() //Most ARM chips can simply call
IGN5_TIMER_DISABLE();
}
}
#endif
#if defined(CORE_TEENSY)
@ -1125,5 +1344,34 @@ void ftm0_isr(void)
else if(interrupt7) { FTM0_C6SC &= ~FTM_CSC_CHF; ignitionSchedule3Interrupt(); }
else if(interrupt8) { FTM0_C7SC &= ~FTM_CSC_CHF; ignitionSchedule4Interrupt(); }
}
void ftm3_isr(void)
{
#if (INJ_CHANNELS >= 5)
if(bool(FTM3_C0SC & FTM_CSC_CHF)) { FTM3_C0SC &= ~FTM_CSC_CHF; fuelSchedule5Interrupt(); }
#endif
#if (INJ_CHANNELS >= 6)
else if(bool(FTM3_C1SC & FTM_CSC_CHF)) { FTM3_C1SC &= ~FTM_CSC_CHF; fuelSchedule6Interrupt(); }
#endif
#if (INJ_CHANNELS >= 7)
else if(bool(FTM3_C2SC & FTM_CSC_CHF)) { FTM3_C2SC &= ~FTM_CSC_CHF; fuelSchedule7Interrupt(); }
#endif
#if (INJ_CHANNELS >= 8)
else if(bool(FTM3_C3SC & FTM_CSC_CHF)) { FTM3_C3SC &= ~FTM_CSC_CHF; fuelSchedule8Interrupt(); }
#endif
#if (IGN_CHANNELS >= 5)
if(bool(FTM3_C4SC & FTM_CSC_CHF)) { FTM3_C4SC &= ~FTM_CSC_CHF; ignitionSchedule5Interrupt(); }
#endif
#if (IGN_CHANNELS >= 6)
else if(bool(FTM3_C5SC & FTM_CSC_CHF)) { FTM3_C5SC &= ~FTM_CSC_CHF; ignitionSchedule6Interrupt(); }
#endif
#if (IGN_CHANNELS >= 7)
else if(bool(FTM3_C6SC & FTM_CSC_CHF)) { FTM3_C6SC &= ~FTM_CSC_CHF; ignitionSchedule7Interrupt(); }
#endif
#if (IGN_CHANNELS >= 8)
else if(bool(FTM3_C7SC & FTM_CSC_CHF)) { FTM3_C7SC &= ~FTM_CSC_CHF; ignitionSchedule8Interrupt(); }
#endif
}
#endif

View File

@ -42,6 +42,8 @@ void initialiseADC()
BIT_CLEAR(ADCSRA,ADPS1);
BIT_CLEAR(ADCSRA,ADPS0);
#endif
#elif defined(ARDUINO_ARCH_STM32) //STM32GENERIC lib
analogReadResolution(10); //use 10bits for analog
#endif
MAPcurRev = 0;
MAPcount = 0;
@ -119,7 +121,6 @@ static inline void readMAP()
if(currentStatus.MAP < 0) { currentStatus.MAP = 0; } //Sanity check
}
else { instanteneousMAPReading(); }
MAPcurRev = currentStatus.startRevolutions; //Reset the current rev count
MAPrunningValue = 0;
MAPcount = 0;

View File

@ -133,6 +133,12 @@ void (*ign4StartFunction)();
void (*ign4EndFunction)();
void (*ign5StartFunction)();
void (*ign5EndFunction)();
void (*ign6StartFunction)();
void (*ign6EndFunction)();
void (*ign7StartFunction)();
void (*ign7EndFunction)();
void (*ign8StartFunction)();
void (*ign8EndFunction)();
volatile int timePerDegree;
byte degreesPerLoop; //The number of crank degrees that pass for each mainloop of the program
@ -141,9 +147,11 @@ bool initialisationComplete = false; //Tracks whether the setup() functino has r
void setup()
{
initialiseTimers();
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
//Setup the dummy fuel and ignition tables
//dummyFuelTable(&fuelTable);
//dummyIgnitionTable(&ignitionTable);
table3D_setSize(&fuelTable, 16);
table3D_setSize(&ignitionTable, 16);
table3D_setSize(&afrTable, 16);
@ -154,10 +162,8 @@ void setup()
table3D_setSize(&trim2Table, 6);
table3D_setSize(&trim3Table, 6);
table3D_setSize(&trim4Table, 6);
initialiseTimers();
#if defined(CORE_STM32)
EEPROM.init();
#endif
loadConfig();
doUpdates(); //Check if any data items need updating (Occurs ith firmware updates)
@ -166,16 +172,9 @@ void setup()
configPage4.bootloaderCaps = 0;
Serial.begin(115200);
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) //ATmega2561 does not have Serial3
if (configPage9.enable_canbus == 1) { CANSerial.begin(115200); }
#elif defined(CORE_STM32)
if (configPage9.enable_canbus == 1) { CANSerial.begin(115200); }
else if (configPage9.enable_canbus == 2)
{
//enable local can interface
}
#elif defined(CORE_TEENSY)
if (configPage9.enable_canbus == 1) { CANSerial.begin(115200); }
#if defined(CORE_STM32) || defined(CORE_TEENSY)
else if (configPage9.enable_canbus == 2)
{
//Teensy onboard CAN not used currently
@ -185,7 +184,8 @@ void setup()
//static CAN_message_t txmsg,rxmsg;
//CANbus0.begin();
}
#endif
#endif
//Repoint the 2D table structs to the config pages that were just loaded
taeTable.valueSize = SIZE_BYTE; //Set this table to use byte values
@ -665,6 +665,12 @@ void setup()
ign4EndFunction = endCoil4Charge;
ign5StartFunction = beginCoil5Charge;
ign5EndFunction = endCoil5Charge;
ign6StartFunction = beginCoil6Charge;
ign6EndFunction = endCoil6Charge;
ign7StartFunction = beginCoil7Charge;
ign7EndFunction = endCoil7Charge;
ign8StartFunction = beginCoil8Charge;
ign8EndFunction = endCoil8Charge;
break;
case IGN_MODE_ROTARY:
@ -721,48 +727,34 @@ void loop()
// 1) Every 64 loops (64 Is more than fast enough for TunerStudio). This function is equivalent to ((loopCount % 64) == 1) but is considerably faster due to not using the mod or division operations
// 2) If the amount of data in the serial buffer is greater than a set threhold (See globals.h). This is to avoid serial buffer overflow when large amounts of data is being sent
//if ( (BIT_CHECK(TIMER_mask, BIT_TIMER_15HZ)) || (Serial.available() > SERIAL_BUFFER_THRESHOLD) )
//if ( (timer15Hz == true) )
if ( ((mainLoopCount & 31) == 1) or (Serial.available() > SERIAL_BUFFER_THRESHOLD) )
{
if (Serial.available() > 0) { command(); }
}
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) //ATmega2561 does not have Serial3
//if serial3 interface is enabled then check for serial3 requests.
if (configPage9.enable_canbus == 1)
{
if ( (BIT_CHECK(LOOP_TIMER, BIT_TIMER_15HZ)) || (CANSerial.available() > SERIAL_BUFFER_THRESHOLD) )
{
if (CANSerial.available() > 0) { canCommand(); }
}
}
#elif defined(CORE_TEENSY) || defined(CORE_STM32)
//if can or secondary serial interface is enabled then check for requests.
if (configPage9.enable_canbus == 1) //secondary serial interface enabled
{
if ( (BIT_CHECK(LOOP_TIMER, BIT_TIMER_15HZ)) || (CANSerial.available() > SERIAL_BUFFER_THRESHOLD) )
{
if (CANSerial.available() > 0) { canCommand(); }
}
}
else if (configPage9.enable_canbus == 2) // can module enabled
{
if ( ((mainLoopCount & 31) == 1) or (CANSerial.available() > SERIAL_BUFFER_THRESHOLD) )
{
if (CANSerial.available() > 0) { canCommand(); }
}
}
#if defined(CORE_TEENSY) || defined(CORE_STM32)
else if (configPage9.enable_canbus == 2) // can module enabled
{
//check local can module
// if ( (BIT_CHECK(LOOP_TIMER, BIT_TIMER_15HZ)) or (CANbus0.available())
// if ( BIT_CHECK(LOOP_TIMER, BIT_TIMER_15HZ) or (CANbus0.available())
// {
// CANbus0.read(rx_msg);
// }
}
#endif
#endif
//Displays currently disabled
// if (configPage2.displayType && (mainLoopCount & 255) == 1) { updateDisplay();}
previousLoopTime = currentLoopTime;
currentLoopTime = micros();
currentLoopTime = micros_safe();
unsigned long timeToLastTooth = (currentLoopTime - toothLastToothTime);
if ( (timeToLastTooth < MAX_STALL_TIME) || (toothLastToothTime > currentLoopTime) ) //Check how long ago the last tooth was seen compared to now. If it was more than half a second ago then the engine is probably stopped. toothLastToothTime can be greater than currentLoopTime if a pulse occurs between getting the lastest time and doing the comparison
{
@ -928,12 +920,12 @@ void loop()
#endif
vvtControl();
idleControl(); //Perform any idle related actions. Even at higher frequencies, running 4x per second is sufficient.
}
} //4Hz timer
if (BIT_CHECK(LOOP_TIMER, BIT_TIMER_1HZ)) //Once per second)
{
BIT_CLEAR(TIMER_mask, BIT_TIMER_1HZ);
readBaro(); //Infrequent baro readings are not an issue.
}
} //1Hz timer
if(configPage6.iacAlgorithm == IAC_ALGORITHM_STEP_OL || configPage6.iacAlgorithm == IAC_ALGORITHM_STEP_CL) { idleControl(); } //Run idlecontrol every loop for stepper idle.
@ -1069,7 +1061,8 @@ void loop()
}
else
{
long rpm_adjust = ((long)(micros() - toothOneTime) * (long)currentStatus.rpmDOT) / 1000000; //Take into account any likely accleration that has occurred since the last full revolution completed
interruptSafe(long elapsedTime = (micros() - toothOneTime);) //micros() is no longer interrupt safe
long rpm_adjust = (elapsedTime * (long)currentStatus.rpmDOT) / 1000000; //Take into account any likely accleration that has occurred since the last full revolution completed
timePerDegree = ldiv( 166666L, currentStatus.RPM + rpm_adjust).quot; //There is a small amount of rounding in this calculation, however it is less than 0.001 of a uS (Faster as ldiv than / )
}
@ -1082,7 +1075,8 @@ void loop()
if( (!BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK)) && configPage10.stagingEnabled == false) { if (currentStatus.PW1 > pwLimit) { currentStatus.PW1 = pwLimit; } }
//Calculate staging pulsewidths if used
if(configPage10.stagingEnabled == true)
//To run staged injection, the number of cylinders must be less than or equal to the injector channels (ie Assuming you're running paired injection, you need at least as many injector channels as you have cylinders, half for the primaries and half for the secondaries)
if( (configPage10.stagingEnabled == true) && (configPage2.nCylinders <= INJ_CHANNELS) )
{
//Scale the 'full' pulsewidth by each of the injector capacities
uint32_t tempPW1 = ((unsigned long)currentStatus.PW1 * staged_req_fuel_mult_pri) / 100;
@ -1548,7 +1542,18 @@ void loop()
//Likewise for the ignition
//fixedCrankingOverride is used to extend the dwell during cranking so that the decoder can trigger the spark upon seeing a certain tooth. Currently only available on the basic distributor and 4g63 decoders.
if ( configPage4.ignCranklock && BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) && (decoderHasFixedCrankingTiming == true) ) { fixedCrankingOverride = currentStatus.dwell * 3; }
if ( configPage4.ignCranklock && BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK) && (decoderHasFixedCrankingTiming == true) )
{
fixedCrankingOverride = currentStatus.dwell * 3;
//This is a safety step to prevent the ignition start time occuring AFTER the target tooth pulse has already occcured. It simply moves the start time forward a little, which is compensated for by the increase in the dwell time
if(currentStatus.RPM < 250)
{
ignition1StartAngle -= 5;
ignition2StartAngle -= 5;
ignition3StartAngle -= 5;
ignition4StartAngle -= 5;
}
}
else { fixedCrankingOverride = 0; }
//Perform an initial check to see if the ignition is turned on (Ignition only turns on after a preset number of cranking revolutions and:
@ -1568,6 +1573,7 @@ void loop()
crankAngle = getCrankAngle(timePerDegree); //Refresh with the latest crank angle
if (crankAngle > CRANK_ANGLE_MAX_IGN ) { crankAngle -= 360; }
#if IGN_CHANNELS >= 1
if ( (ignition1StartAngle > crankAngle) && (curRollingCut != 1) )
{
/*
@ -1587,6 +1593,7 @@ void loop()
);
}
}
#endif
/*
if( (ignitionSchedule1.Status == RUNNING) && (ignition1EndAngle > crankAngle) && configPage4.StgCycles == 0)
{
@ -1605,7 +1612,7 @@ void loop()
*/
#if IGN_CHANNELS >= 2
tempCrankAngle = crankAngle - channel2IgnDegrees;
if( tempCrankAngle < 0) { tempCrankAngle += CRANK_ANGLE_MAX_IGN; }
tempStartAngle = ignition2StartAngle - channel2IgnDegrees;
@ -1625,7 +1632,9 @@ void loop()
);
}
}
#endif
#if IGN_CHANNELS >= 3
tempCrankAngle = crankAngle - channel3IgnDegrees;
if( tempCrankAngle < 0) { tempCrankAngle += CRANK_ANGLE_MAX_IGN; }
tempStartAngle = ignition3StartAngle - channel3IgnDegrees;
@ -1646,7 +1655,9 @@ void loop()
);
}
}
#endif
#if IGN_CHANNELS >= 4
tempCrankAngle = crankAngle - channel4IgnDegrees;
if( tempCrankAngle < 0) { tempCrankAngle += CRANK_ANGLE_MAX_IGN; }
tempStartAngle = ignition4StartAngle - channel4IgnDegrees;
@ -1668,7 +1679,9 @@ void loop()
);
}
}
#endif
#if IGN_CHANNELS >= 5
tempCrankAngle = crankAngle - channel5IgnDegrees;
if( tempCrankAngle < 0) { tempCrankAngle += CRANK_ANGLE_MAX_IGN; }
tempStartAngle = ignition5StartAngle - channel5IgnDegrees;
@ -1689,6 +1702,29 @@ void loop()
);
}
}
#endif
#if IGN_CHANNELS >= 6
tempCrankAngle = crankAngle - channel6IgnDegrees;
if( tempCrankAngle < 0) { tempCrankAngle += CRANK_ANGLE_MAX_IGN; }
tempStartAngle = ignition6StartAngle - channel6IgnDegrees;
if ( tempStartAngle < 0) { tempStartAngle += CRANK_ANGLE_MAX_IGN; }
{
unsigned long ignition6StartTime = 0;
if(tempStartAngle > tempCrankAngle) { ignition6StartTime = degreesToUS((tempStartAngle - tempCrankAngle)); }
else { ignition6StartTime = 0; }
if( (ignition6StartTime > 0) && (curRollingCut != 2) )
{
setIgnitionSchedule6(ign6StartFunction,
ignition6StartTime,
currentStatus.dwell + fixedCrankingOverride,
ign6EndFunction
);
}
}
#endif
} //Ignition schedules on
if (!BIT_CHECK(currentStatus.status3, BIT_STATUS3_RESET_PREVENT) && resetControl == RESET_CONTROL_PREVENT_WHEN_RUNNING) {

View File

@ -7,7 +7,11 @@ void loadConfig();
void loadCalibration();
void writeCalibration();
#if defined(CORE_STM32) || defined(CORE_TEENSY)
#define EEPROM_MAX_WRITE_BLOCK 64 //The maximum number of write operations that will be performed in one go. If we try to write to the EEPROM too fast (Each write takes ~3ms) then the rest of the system can hang)
#else
#define EEPROM_MAX_WRITE_BLOCK 30 //The maximum number of write operations that will be performed in one go. If we try to write to the EEPROM too fast (Each write takes ~3ms) then the rest of the system can hang)
#endif
bool eepromWritesPending = false;
/*

View File

@ -42,6 +42,7 @@ void writeConfig(byte tableNum)
byte newVal; //Used for tempoerarily storing the new intended value
//Create a pointer to the config page
byte* pnt_configPage;
switch(tableNum)
{
case veMapPage:

View File

@ -64,7 +64,7 @@ int table2D_getValue(struct table2D *fromTable, int X_in)
int xMax = 0;
//Check whether the X input is the same as last time this ran
if(X_in == fromTable->lastInput && fromTable->cacheTime == currentStatus.secl)
if( (X_in == fromTable->lastInput) && (fromTable->cacheTime == currentStatus.secl) )
{
returnValue = fromTable->lastOutput;
valueFound = true;

View File

@ -29,6 +29,14 @@ volatile unsigned int dwellLimit_uS;
volatile uint16_t lastRPM_100ms; //Need to record this for rpmDOT calculation
volatile uint16_t last250msLoopCount = 1000; //Set to effectively random number on startup. Just need this to be different to what mainLoopCount equals initially (Probably 0)
#if defined(TIMER5_MICROS)
#define micros() (((timer5_overflow_count << 16) + TCNT5) * 4) //Fast version of micros() that uses the 4uS tick of timer5. See timers.ino for the overflow ISR of timer5
#define millis() (ms_counter) //Replaces the standard millis() function with this macro. It is both faster and more accurate. See timers.ino for its counter increment.
static inline unsigned long micros_safe(); //A version of micros() that is interrupt safe
#else
#define micros_safe() micros() //If the timer5 method is not used, the micros_safe() macro is simply an alias for the normal micros()
#endif
#if defined (CORE_TEENSY)
IntervalTimer lowResTimer;
void oneMSInterval();

View File

@ -40,16 +40,19 @@ void initialiseTimers()
lowResTimer.begin(oneMSInterval, 1000);
#elif defined(CORE_STM32)
#if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_)
Timer8.setPeriod(1000); // Set up period
Timer8.setMode(1, TIMER_OUTPUT_COMPARE);
Timer8.attachInterrupt(1, oneMSInterval);
Timer8.resume(); //Start Timer
#else
Timer4.setPeriod(1000); // Set up period
// Set up an interrupt
Timer4.setMode(1, TIMER_OUTPUT_COMPARE);
Timer4.attachInterrupt(1, oneMSInterval);
Timer4.resume(); //Start Timer
#endif
#if defined(CORE_STM32)
pinMode(LED_BUILTIN, OUTPUT);
#endif
pinMode(LED_BUILTIN, OUTPUT); //Visual WDT
#endif
lastRPM_100ms = 0;
loop33ms = 0;
@ -63,11 +66,12 @@ void initialiseTimers()
//Timer2 Overflow Interrupt Vector, called when the timer overflows.
//Executes every ~1ms.
#if defined(CORE_AVR) //AVR chips use the ISR for this
ISR(TIMER2_OVF_vect, ISR_NOBLOCK)
ISR(TIMER2_OVF_vect)
#elif defined (CORE_TEENSY) || defined(CORE_STM32)
void oneMSInterval() //Most ARM chips can simply call a function
#endif
{
ms_counter++;
//Increment Loop Counters
loop33ms++;
@ -111,9 +115,6 @@ void oneMSInterval() //Most ARM chips can simply call a function
{
loop100ms = 0; //Reset counter
BIT_SET(TIMER_mask, BIT_TIMER_10HZ);
#if defined(CORE_STM32) //debug purpose, only visal for running code
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
#endif
currentStatus.rpmDOT = (currentStatus.RPM - lastRPM_100ms) * 10; //This is the RPM per second that the engine has accelerated/decelleratedin the last loop
lastRPM_100ms = currentStatus.RPM; //Record the current RPM for next calc
@ -125,6 +126,9 @@ void oneMSInterval() //Most ARM chips can simply call a function
{
loop250ms = 0; //Reset Counter
BIT_SET(TIMER_mask, BIT_TIMER_4HZ);
#if defined(CORE_STM32) //debug purpose, only visal for running code
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
#endif
#if defined(CORE_AVR)
//Reset watchdog timer (Not active currently)
@ -143,7 +147,7 @@ void oneMSInterval() //Most ARM chips can simply call a function
BIT_SET(TIMER_mask, BIT_TIMER_1HZ);
dwellLimit_uS = (1000 * configPage4.dwellLimit); //Update uS value incase setting has changed
currentStatus.crankRPM = ((unsigned int)configPage4.crankRPM * 100);
currentStatus.crankRPM = ((unsigned int)configPage4.crankRPM * 10);
//**************************************************************************************************************************************************
//This updates the runSecs variable
@ -223,3 +227,21 @@ void oneMSInterval() //Most ARM chips can simply call a function
TIFR2 = 0x00; //Timer2 INT Flag Reg: Clear Timer Overflow Flag
#endif
}
#if defined(TIMER5_MICROS)
//This is used by the fast version of micros(). We just need to increment the timer overflow counter
ISR(TIMER5_OVF_vect)
{
++timer5_overflow_count;
}
static inline unsigned long micros_safe()
{
unsigned long newMicros;
noInterrupts();
newMicros = micros();
interrupts();
return newMicros;
}
#endif

View File

@ -95,14 +95,21 @@ void doUpdates()
if (EEPROM.read(EEPROM_DATA_VERSION) == 7) {
//Convert whatever flex fuel settings are there into the new tables
configPage10.flexBoostAdj[0] = (int8_t)configPage2.unused2_1;
configPage10.flexBoostBins[0] = 0;
configPage10.flexBoostAdj[0] = (int8_t)configPage2.unused2_1;
configPage10.flexFuelBins[0] = 0;
configPage10.flexFuelAdj[0] = configPage2.unused2_57;
configPage10.flexAdvAdj[0] = configPage2.unused2_59;
configPage10.flexAdvBins[0] = 0;
configPage10.flexAdvAdj[0] = configPage2.unused2_59;
for (uint8_t x = 1; x < 6; x++)
{
uint8_t pct = x * 20;
configPage10.flexBoostBins[x] = configPage10.flexFuelBins[x] = configPage10.flexAdvBins[x] = pct;
configPage10.flexBoostBins[x] = pct;
configPage10.flexFuelBins[x] = pct;
configPage10.flexAdvBins[x] = pct;
int16_t boostAdder = (((configPage2.unused2_2 - (int8_t)configPage2.unused2_1) * pct) / 100) + (int8_t)configPage2.unused2_1;
configPage10.flexBoostAdj[x] = boostAdder;

View File

@ -239,23 +239,32 @@ void setPinMapping(byte boardID)
pinCoil3 = 30;
pinO2 = A22;
#elif defined(STM32F4)
//Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407
//PC8~PC12 SDio
//PA13~PA15 & PB4 SWD(debug) pins
//PB0 EEPROM CS pin
//PD5 & PD6 Serial2
pinInjector1 = PE7; //Output pin injector 1 is on
pinInjector2 = PE8; //Output pin injector 2 is on
pinInjector3 = PE9; //Output pin injector 3 is on
pinInjector4 = PE10; //Output pin injector 4 is on
pinInjector5 = PE11; //Output pin injector 5 is on
pinCoil1 = PB10; //Pin for coil 1
pinCoil2 = PB11; //Pin for coil 2
pinCoil3 = PB12; //Pin for coil 3
pinCoil4 = PB13; //Pin for coil 4
pinCoil5 = PB14; //Pin for coil 5
pinCoil1 = PB5; //Pin for coil 1
pinCoil2 = PB6; //Pin for coil 2
pinCoil3 = PB7; //Pin for coil 3
pinCoil4 = PB8; //Pin for coil 4
pinCoil5 = PB9; //Pin for coil 5
pinTPS = A0; //TPS input pin
pinMAP = A1; //MAP sensor pin
pinIAT = A2; //IAT sensor pin
pinCLT = A3; //CLS sensor pin
pinCLT = A3; //CLT sensor pin
pinO2 = A4; //O2 Sensor pin
pinBat = A5; //Battery reference voltage pin
pinBaro = A6;
pinBaro = A10;
pinIdle1 = PB8; //Single wire idle control
pinIdle2 = PB9; //2 wire idle control
pinBoost = PE0; //Boost control
pinVVT_1 = PE1; //Default VVT output
pinStepperDir = PD8; //Direction pin for DRV8825 driver
pinStepperStep = PB15; //Step pin for DRV8825 driver
pinStepperEnable = PD9; //Enable pin for DRV8825
@ -264,43 +273,45 @@ void setPinMapping(byte boardID)
pinFuelPump = PA6; //Fuel pump output
pinTachOut = PA7; //Tacho output pin
//external interrupt enabled pins
pinFlex = PC4; // Flex sensor (Must be external interrupt enabled)
pinTrigger = PC5; //The CAS pin
pinTrigger2 = PC6; //The Cam Sensor pin
pinBoost = PE0; //Boost control
pinVVT_1 = PE1; //Default VVT output
//external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4)
pinFlex = PE2; // Flex sensor (Must be external interrupt enabled)
pinTrigger = PE3; //The CAS pin
pinTrigger2 = PE4; //The Cam Sensor pin
#elif defined(CORE_STM32)
//http://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/0.0.12/hardware/maple-mini.html#master-pin-map
//pins 23, 24 and 33 couldn't be used
pinInjector1 = 15; //Output pin injector 1 is on
pinInjector2 = 16; //Output pin injector 2 is on
pinInjector3 = 17; //Output pin injector 3 is on
pinInjector4 = 18; //Output pin injector 4 is on
pinCoil1 = 19; //Pin for coil 1
pinCoil2 = 20; //Pin for coil 2
pinCoil3 = 21; //Pin for coil 3
pinCoil4 = 26; //Pin for coil 4
pinCoil5 = 27; //Pin for coil 5
//blue pill http://wiki.stm32duino.com/index.php?title=Blue_Pill
//Maple mini http://wiki.stm32duino.com/index.php?title=Maple_Mini
//pins PA12, PA11 are used for USB or CAN couldn't be used for GPIO
pinInjector1 = PB7; //Output pin injector 1 is on
pinInjector2 = PB6; //Output pin injector 2 is on
pinInjector3 = PB5; //Output pin injector 3 is on
pinInjector4 = PB4; //Output pin injector 4 is on
pinCoil1 = PB3; //Pin for coil 1
pinCoil2 = PA15; //Pin for coil 2
pinCoil3 = PA14; //Pin for coil 3
pinCoil4 = PA9; //Pin for coil 4
pinCoil5 = PA8; //Pin for coil 5
pinTPS = A0; //TPS input pin
pinMAP = A1; //MAP sensor pin
pinIAT = A2; //IAT sensor pin
pinCLT = A3; //CLS sensor pin
pinO2 = A4; //O2 Sensor pin
pinBat = A5; //Battery reference voltage pin
pinStepperDir = 12; //Direction pin for DRV8825 driver
pinStepperStep = 13; //Step pin for DRV8825 driver
pinStepperEnable = 14; //Enable pin for DRV8825
pinDisplayReset = 2; // OLED reset pin
pinFan = 1; //Pin for the fan output
pinFuelPump = 0; //Fuel pump output
pinTachOut = 31; //Tacho output pin
//external interrupt enabled pins
pinFlex = 32; // Flex sensor (Must be external interrupt enabled)
pinTrigger = 25; //The CAS pin
pinTrigger2 = 22; //The Cam Sensor pin
pinBaro = pinMAP;
pinBoost = 1; //Boost control
pinVVT_1 = 0; //Default VVT output
pinIdle1 = PB2; //Single wire idle control
pinIdle2 = PA2; //2 wire idle control
pinBoost = PA1; //Boost control
pinVVT_1 = PA0; //Default VVT output
pinStepperDir = PC15; //Direction pin for DRV8825 driver
pinStepperStep = PC14; //Step pin for DRV8825 driver
pinStepperEnable = PC13; //Enable pin for DRV8825
pinDisplayReset = PB2; // OLED reset pin
pinFan = PB1; //Pin for the fan output
pinFuelPump = PB11; //Fuel pump output
pinTachOut = PB10; //Tacho output pin
//external interrupt enabled pins
pinFlex = PB8; // Flex sensor (Must be external interrupt enabled)
pinTrigger = PA10; //The CAS pin
pinTrigger2 = PA13; //The Cam Sensor pin
#endif
break;
@ -688,6 +699,12 @@ void setPinMapping(byte boardID)
inj4_pin_mask = digitalPinToBitMask(pinInjector4);
inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5));
inj5_pin_mask = digitalPinToBitMask(pinInjector5);
inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6));
inj6_pin_mask = digitalPinToBitMask(pinInjector6);
inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7));
inj7_pin_mask = digitalPinToBitMask(pinInjector7);
inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8));
inj8_pin_mask = digitalPinToBitMask(pinInjector8);
ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1));
ign1_pin_mask = digitalPinToBitMask(pinCoil1);
@ -699,13 +716,18 @@ void setPinMapping(byte boardID)
ign4_pin_mask = digitalPinToBitMask(pinCoil4);
ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5));
ign5_pin_mask = digitalPinToBitMask(pinCoil5);
ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6));
ign6_pin_mask = digitalPinToBitMask(pinCoil6);
ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7));
ign7_pin_mask = digitalPinToBitMask(pinCoil7);
ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8));
ign8_pin_mask = digitalPinToBitMask(pinCoil8);
tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut));
tach_pin_mask = digitalPinToBitMask(pinTachOut);
pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump));
pump_pin_mask = digitalPinToBitMask(pinFuelPump);
//And for inputs
//And for inputs
#if defined(CORE_STM32)
#ifndef ARDUINO_ARCH_STM32 //libmaple core aka STM32DUINO