Initial commit
This commit is contained in:
commit
bbde15f9bf
283
.cproject
Normal file
283
.cproject
Normal file
@ -0,0 +1,283 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
||||
<macros>
|
||||
<stringMacro name="__CM4_REV" type="VALUE_TEXT" value="0"/>
|
||||
</macros>
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765" name="Debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug" postannouncebuildStep="" postbuildStep="" preannouncebuildStep="" prebuildStep="">
|
||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765." name="/" resourcePath="">
|
||||
<toolChain errorParsers="" id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.1854751117" name="Cross ARM GCC" nonInternalBuilderId="ilg.gnuarmeclipse.managedbuild.cross.builder" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.235990940" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.525011748" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" useByScannerDiscovery="true" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.652051416" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" useByScannerDiscovery="true" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.2120457832" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" useByScannerDiscovery="true" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections.1183840552" name="Data sections (-fdata-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections" useByScannerDiscovery="true" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level.299777029" name="Debug level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level" useByScannerDiscovery="true" value="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level.max" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format.657485291" name="Debug format" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format" useByScannerDiscovery="true"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name.742151801" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name" useByScannerDiscovery="false" value="Sourcery CodeBench Lite for ARM EABI" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.134296343" name="Architecture" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.architecture" useByScannerDiscovery="false" value="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.arm" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family.1304847864" name="ARM family" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family" useByScannerDiscovery="false" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.mcpu.cortex-m4" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.18878311" name="Instruction set" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset" useByScannerDiscovery="false" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.thumb" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix.528820877" name="Prefix" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix" useByScannerDiscovery="false" value="arm-none-eabi-" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.c.1965477367" name="C compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.c" useByScannerDiscovery="false" value="gcc" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp.1689765874" name="C++ compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp" useByScannerDiscovery="false" value="g++" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar.1897114813" name="Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar" useByScannerDiscovery="false" value="ar" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy.1347693698" name="Hex/Bin converter" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy" useByScannerDiscovery="false" value="objcopy" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump.119866392" name="Listing generator" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump" useByScannerDiscovery="false" value="objdump" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.size.225381161" name="Size command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.size" useByScannerDiscovery="false" value="size" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.make.129845409" name="Build command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.make" useByScannerDiscovery="false" value="cs-make" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm.645767312" name="Remove command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm" useByScannerDiscovery="false" value="cs-rm" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash.46031997" name="Create flash image" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize.934798819" name="Print size" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.unit.1709970612" name="FPU Type" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.unit" useByScannerDiscovery="true" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.unit.fpv4spd16" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.abi.447103466" name="Float ABI" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.abi" useByScannerDiscovery="true" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.abi.hard" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.target.other.441844501" name="Other target flags" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.target.other" useByScannerDiscovery="true" value="" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.id.1159771958" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.id" useByScannerDiscovery="false" value="730666677" valueType="string"/>
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1111832768" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
||||
<builder buildPath="${ProjName}/Debug" errorParsers="org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.CWDLocator" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1846842658" keepEnvironmentInBuildfile="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
||||
<tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1135800266" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.401541642" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.asmlisting.993021628" name="Generate assembler listing (-Wa,-adhlns="$@.lst")" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.asmlisting" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input.614857886" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input"/>
|
||||
</tool>
|
||||
<tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1173441847" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.paths.862213974" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/include}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/Vinclude}""/>
|
||||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.asmlisting.1665590179" name="Generate assembler listing (-Wa,-adhlns="$@.lst")" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.asmlisting" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs.1155328255" name="Defined symbols (-D)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs" useByScannerDiscovery="false"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.std.1685330845" name="Language standard" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.std" useByScannerDiscovery="true" value="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.std.gnu11" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.savetemps.961642540" name="Save temporary files (--save-temps Use with caution!)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.savetemps" useByScannerDiscovery="false" value="false" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.files.582164422" name="Include files (-include)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.files" useByScannerDiscovery="false"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.other.1165832177" name="Other compiler flags" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.other" useByScannerDiscovery="true" value="-fsingle-precision-constant" valueType="string"/>
|
||||
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.2065717434" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.1157053913" name="Cross ARM C++ Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler"/>
|
||||
<tool command="${cross_prefix}${cross_c}${cross_suffix}" commandLinePattern="${COMMAND} ${cross_toolchain_flags} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="" id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.1599914735" name="Cross ARM C Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.gcsections.1597911657" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.gcsections" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.scriptfile.2036328640" name="Script files (-T)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.scriptfile" useByScannerDiscovery="false" valueType="stringList">
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/cmd/build.ld}""/>
|
||||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.nodeflibs.1760740393" name="Do not use default libraries (-nodefaultlibs)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.nodeflibs" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.nostdlibs.109724705" name="No startup or default libs (-nostdlib)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.nostdlibs" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.flags.1121633783" name="Linker flags (-Xlinker [option])" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.flags" useByScannerDiscovery="false" valueType="stringList">
|
||||
<listOptionValue builtIn="false" value="-L"${workspace_loc:/${ProjName}/cmd/}""/>
|
||||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.libs.1870399126" name="Libraries (-l)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.libs" useByScannerDiscovery="false"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.paths.2019339927" name="Library search path (-L)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.paths" useByScannerDiscovery="false" valueType="libPaths">
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib}""/>
|
||||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.otherobjs.1640812717" name="Other objects" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.otherobjs" useByScannerDiscovery="false" valueType="userObjs">
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib/libc.a}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib/libgcc.a}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib/libm.a}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib/libCANOpen_drv.a}""/>
|
||||
</option>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.other.1870052095" name="Other linker flags" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.other" useByScannerDiscovery="false" value="" valueType="string"/>
|
||||
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.input.661667903" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker.675986085" name="Cross ARM C++ Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.linker.gcsections.1571586785" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.linker.gcsections" value="true" valueType="boolean"/>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver.2093549256" name="Cross ARM GNU Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver"/>
|
||||
<tool command="${cross_prefix}${cross_objcopy}${cross_suffix}" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT}" errorParsers="" id="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash.1548863923" name="Cross ARM GNU Create Flash Image" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createflash.choice.1388885304" name="Output file format (-O)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createflash.choice" useByScannerDiscovery="false" value="ilg.gnuarmeclipse.managedbuild.cross.option.createflash.choice.srec" valueType="enumerated"/>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting.757444280" name="Cross ARM GNU Create Listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.source.1854964062" name="Display source (--source|-S)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.source" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.allheaders.1182181489" name="Display all headers (--all-headers|-x)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.allheaders" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.demangle.2011876984" name="Demangle names (--demangle|-C)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.demangle" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.linenumbers.1025685360" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.linenumbers" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.wide.1836553439" name="Wide lines (--wide|-w)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.wide" value="true" valueType="boolean"/>
|
||||
</tool>
|
||||
<tool command="${cross_prefix}${cross_size}${cross_suffix}" commandLinePattern="${COMMAND} ${FLAGS}" errorParsers="" id="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize.2125940164" name="Cross ARM GNU Print Size" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.printsize.format.1774335776" name="Size format" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.printsize.format" useByScannerDiscovery="false"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<fileInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765.2018936083" name="V_PWM_Module.c" rcbsApplicability="disable" resourcePath="Vsrc/V_PWM_Module.c" toolsToInvoke="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1173441847.1551872100">
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1173441847.1551872100" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1173441847">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.other.627528704" name="Other compiler flags" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.other" useByScannerDiscovery="true" value="-fsingle-precision-constant" valueType="string"/>
|
||||
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.881201789" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input"/>
|
||||
</tool>
|
||||
</fileInfo>
|
||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765.1805741637" name="/" resourcePath="asm">
|
||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.2004030594" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug" unusedChildren="">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.235990940.1469338465" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.235990940"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.525011748.557746189" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.525011748"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.652051416.1829109825" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.652051416"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.2120457832.965682008" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.2120457832"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections.1183840552.1069986439" name="Data sections (-fdata-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections.1183840552"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level.299777029.174791892" name="Debug level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level.299777029"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format.657485291.778908462" name="Debug format" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format.657485291"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name.742151801.1539427334" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name.742151801"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.134296343.2019577032" name="Architecture" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.134296343"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family.1304847864.1307159765" name="ARM family" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family.1304847864"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.18878311.1891767763" name="Instruction set" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.18878311"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix.528820877.77349213" name="Prefix" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix.528820877"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.c.1965477367.952176845" name="C compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.c.1965477367"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp.1689765874.600565162" name="C++ compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp.1689765874"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar.1897114813.609252004" name="Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar.1897114813"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy.1347693698.1419574728" name="Hex/Bin converter" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy.1347693698"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump.119866392.756056290" name="Listing generator" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump.119866392"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.size.225381161.2122232321" name="Size command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.size.225381161"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.make.129845409.1510147539" name="Build command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.make.129845409"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm.645767312.2133610331" name="Remove command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm.645767312"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash.46031997.2062049049" name="Create flash image" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash.46031997"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize.934798819.306247066" name="Print size" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize.934798819"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.unit.1709970612.1626686790" name="FPU Type" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.unit.1709970612"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.abi.447103466.1557166818" name="Float ABI" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.fpu.abi.447103466"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.target.other.441844501.261835020" name="Other target flags" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.target.other.441844501"/>
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.25739545" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1135800266">
|
||||
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input.321302863" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input"/>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1763788421" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1173441847">
|
||||
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.196061140" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.1416432073" name="Cross ARM C++ Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.1157053913"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.211819828" name="Cross ARM C Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.1599914735"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker.1653887405" name="Cross ARM C++ Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker.675986085"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver.1102438131" name="Cross ARM GNU Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver.2093549256"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash.1436636726" name="Cross ARM GNU Create Flash Image" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash.1548863923"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting.161810835" name="Cross ARM GNU Create Listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting.757444280"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize.1247230212" name="Cross ARM GNU Print Size" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize.2125940164"/>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<fileInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765.395663209" name="DSP.h" rcbsApplicability="disable" resourcePath="Vinclude/DSP.h" toolsToInvoke=""/>
|
||||
<sourceEntries>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Vinclude"/>
|
||||
<entry excluding="dummy_V_CANtoRS.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Vsrc"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="asm"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="include"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
<storageModule moduleId="ilg.gnuarmeclipse.managedbuild.packs"/>
|
||||
</cconfiguration>
|
||||
<cconfiguration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1990299353">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1990299353" moduleId="org.eclipse.cdt.core.settings" name="Release">
|
||||
<macros>
|
||||
<stringMacro name="__CM4_REV" type="VALUE_TEXT" value="0"/>
|
||||
</macros>
|
||||
<externalSettings/>
|
||||
<extensions>
|
||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1990299353" name="Release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1990299353." name="/" resourcePath="">
|
||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.1610871238" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.1079499004" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.594182684" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.1552505082" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.735855855" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections.86415979" name="Data sections (-fdata-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level.2021760111" name="Debug level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format.351498377" name="Debug format" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name.497684385" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name" value="Sourcery CodeBench Lite for ARM EABI" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.250366655" name="Architecture" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.architecture" value="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.arm" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family.1173945392" name="ARM family" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.mcpu.cortex-m3" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.1147412555" name="Instruction set" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.thumb" valueType="enumerated"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix.1570641349" name="Prefix" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix" value="arm-none-eabi-" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.c.1307835816" name="C compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.c" value="gcc" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp.91224007" name="C++ compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp" value="g++" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar.1084724426" name="Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar" value="ar" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy.1409245586" name="Hex/Bin converter" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy" value="objcopy" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump.2050016684" name="Listing generator" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump" value="objdump" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.size.859835010" name="Size command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.size" value="size" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.make.1197053146" name="Build command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.make" value="cs-make" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm.979100724" name="Remove command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm" value="cs-rm" valueType="string"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash.272216713" name="Create flash image" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize.142465801" name="Print size" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize" value="true" valueType="boolean"/>
|
||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1268345674" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
|
||||
<builder buildPath="${ProjName}/Release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1883166023" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.840458930" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1428722614" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
|
||||
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input.1235062357" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input"/>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1949731196" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler">
|
||||
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.376308926" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input"/>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.734894093" name="Cross ARM C++ Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.1586695678" name="Cross ARM C Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.gcsections.1559834360" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.gcsections" value="true" valueType="boolean"/>
|
||||
<inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.input.1104494889" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.input">
|
||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||
</inputType>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker.664076807" name="Cross ARM C++ Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.linker.gcsections.1964261640" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.linker.gcsections" value="true" valueType="boolean"/>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver.719386581" name="Cross ARM GNU Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash.392351902" name="Cross ARM GNU Create Flash Image" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash"/>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting.1061078679" name="Cross ARM GNU Create Listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.source.2019512155" name="Display source (--source|-S)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.source" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.allheaders.1555433963" name="Display all headers (--all-headers|-x)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.allheaders" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.demangle.1566356270" name="Demangle names (--demangle|-C)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.demangle" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.linenumbers.1535886807" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.linenumbers" value="true" valueType="boolean"/>
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.wide.744750058" name="Wide lines (--wide|-w)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.wide" value="true" valueType="boolean"/>
|
||||
</tool>
|
||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize.598242677" name="Cross ARM GNU Print Size" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize">
|
||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.printsize.format.1832178998" name="Size format" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.printsize.format"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
<sourceEntries>
|
||||
<entry excluding="Vinclude|include|src|Vsrc|include/Peripherals|asm/niiet.S|include/UART_API|include/Peripherals/UART_API/PrimeCell_gen_sw|include/Peripherals/eADC/stellaris (do not include)" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Vinclude"/>
|
||||
<entry excluding="dummy_V_CANtoRS.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Vsrc"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="include"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<scannerConfigBuildInfo instanceId="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765;ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765.;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1173441847;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.2065717434">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
<scannerConfigBuildInfo instanceId="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1990299353;ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1990299353.;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1949731196;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.376308926">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||
<configuration configurationName="Debug"/>
|
||||
<configuration configurationName="Release"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="Example_LED_blinking.null.308845348" name="Example_LED_blinking"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||
</cproject>
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/Debug/
|
32
.project
Normal file
32
.project
Normal file
@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>MCD_035</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||
<triggers>clean,full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||
<triggers>full,incremental,</triggers>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
<variableList>
|
||||
<variable>
|
||||
<name>copy_PARENT</name>
|
||||
<value>$%7BPARENT-3-PROJECT_LOC%7D/ProjectsGit/motorcontroldemo</value>
|
||||
</variable>
|
||||
</variableList>
|
||||
</projectDescription>
|
25
.settings/language.settings.xml
Normal file
25
.settings/language.settings.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<project>
|
||||
<configuration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765" name="Debug">
|
||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="520753781973748679" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||
</provider>
|
||||
</extension>
|
||||
</configuration>
|
||||
<configuration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1990299353" name="Release">
|
||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="480357847621646132" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT ARM Cross GCC Built-in Compiler Settings " parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||
</provider>
|
||||
</extension>
|
||||
</configuration>
|
||||
</project>
|
67
.settings/org.eclipse.cdt.codan.core.prefs
Normal file
67
.settings/org.eclipse.cdt.codan.core.prefs
Normal file
@ -0,0 +1,67 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.cdt.codan.checkers.errnoreturn=Warning
|
||||
org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false}
|
||||
org.eclipse.cdt.codan.checkers.errreturnvalue=Error
|
||||
org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.checkers.noreturn=Error
|
||||
org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false}
|
||||
org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=-Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false}
|
||||
org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},unknown\=>false,exceptions\=>()}
|
||||
org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},skip\=>true}
|
||||
org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info
|
||||
org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},pattern\=>"^[a-z]",macro\=>true,exceptions\=>()}
|
||||
org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>()}
|
||||
org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=-Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},paramNot\=>false}
|
||||
org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},else\=>false,afterelse\=>false}
|
||||
org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true}
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true}
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning
|
||||
org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>("@(\#)","$Id")}
|
||||
org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error
|
||||
org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}}
|
11
.settings/org.eclipse.cdt.managedbuilder.core.prefs
Normal file
11
.settings/org.eclipse.cdt.managedbuilder.core.prefs
Normal file
@ -0,0 +1,11 @@
|
||||
eclipse.preferences.version=1
|
||||
environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/CPATH/delimiter=;
|
||||
environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/CPATH/operation=remove
|
||||
environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/C_INCLUDE_PATH/delimiter=;
|
||||
environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/C_INCLUDE_PATH/operation=remove
|
||||
environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/append=true
|
||||
environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/appendContributed=true
|
||||
environment/buildEnvironmentLibrary/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/LIBRARY_PATH/delimiter=;
|
||||
environment/buildEnvironmentLibrary/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/LIBRARY_PATH/operation=remove
|
||||
environment/buildEnvironmentLibrary/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/append=true
|
||||
environment/buildEnvironmentLibrary/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/appendContributed=true
|
203
LICENSE.txt
Normal file
203
LICENSE.txt
Normal file
@ -0,0 +1,203 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
18
README.md
Normal file
18
README.md
Normal file
@ -0,0 +1,18 @@
|
||||
Данный репозиторий включает в себя полноценный работоспособный проект для задач управления двигателем на базе микроконтроллеров серии 1921ВК035 фирмы АО «НИИЭТ». Помимо исходного кода проекта, репозиторий содержит специализированное программное обеспечение, позволяющее производить разработку, отладку и исследование систем управления через интерфейс CAN с протоколом верхнего уровня CANopen. Начинать знакомство с данным ПО следует с файла ```Описание структуры ПО MotorControlDemo.pdf```, находящегося в разделе [Downloads](https://bitbucket.org/niietcm4/motorcontroldemo/downloads/) репозитория [MotorControlDemo](https://bitbucket.org/niietcm4/motorcontroldemo/).
|
||||
|
||||
Состав репозитория:
|
||||
|
||||
- MotorControlDemo – проект с исходными кодами - реализует различные структуры управления электродвигателями различных типов, в том числе с обратными связями по току, скорости, положению. ПО поддерживает обработку следующих датчиков положения/скорости ротора: датчики Холла, инкрементальный энкодер. Реализована коммуникация по интерфейсу CAN по протоколу верхнего уровня CANopen. ПО микроконтроллера разработано в
|
||||
бесплатной среде разработки [VectorIDE (Eclipse+GCC+OpenOCD)](http://motorcontrol.ru/production/soft/vector-ide/).
|
||||
- COODEdit4 NIIET edition - редактор словарей CANopen, далее COODEdit (CanOpen Object Dictionary Editor) – программный продукт, позволяющий осуществлять редактирование словарей объектов для CANopen-совместимых устройств с драйвером данной реализации в графическом виде. Подробнее с возможностями программы можно ознакомиться в руководстве пользователя - см. файл ```COODEdit user manual.pdf``` в разделе [Downloads](https://bitbucket.org/niietcm4/motorcontroldemo/downloads/) репозитория [MotorControlDemo](https://bitbucket.org/niietcm4/motorcontroldemo/).
|
||||
- UniCON - управляющий интерфейс пользователя, набор программных средств, позволяющих осуществлять мониторинг (в том числе снятие осциллограмм переходных процессов) и настройку CANopen-совместимых устройств посредством персонального компьютера. UniCON при помощи переходника CAN-USB или USB-UART конвертора взаимодействует через CANopen с ПО микроконтроллера и обеспечивает интерфейс пользователя.
|
||||
Подробнее с возможностями программы можно ознакомиться в руководстве пользователя - см. файл ```UniCON руководство пользователя.pdf``` в разделе [Downloads](https://bitbucket.org/niietcm4/motorcontroldemo/downloads/) репозитория [MotorControlDemo](https://bitbucket.org/niietcm4/motorcontroldemo/).
|
||||
|
||||
|
||||
С вопросами и предложениями можно обращаться:
|
||||
|
||||
- motorcontrol@niiet.ru
|
||||
- [тема](http://forum.niiet.ru/viewtopic.php?f=37&t=536) на интернет-форуме АО «НИИЭТ»
|
||||
- интернет-форум ООО «НПФ ВЕКТОР» http://motorcontrol.ru/forum/
|
||||
|
||||
*Если вы нашли ошибку в программном обеспечении или документации просьба по возможности оповестить об этом разработчиков любым удобным способом.*
|
68
Vinclude/CANBlockTransferInterface.h
Normal file
68
Vinclude/CANBlockTransferInterface.h
Normal file
@ -0,0 +1,68 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file CANBlockTransferInterface.h
|
||||
\brief Áëî÷íàÿ ïåðåäà÷à äàííûõ äëÿ CANopen
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup CANOpen_drv Äðàéâåð CANOpen
|
||||
@{
|
||||
*/
|
||||
#ifndef CANBLOCKTRANS_INTERFACE_H
|
||||
#define CANBLOCKTRANS_INTERFACE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include "DSP.h"
|
||||
|
||||
#define CANBT_INTERFACE_FREE 0
|
||||
#define CANBT_INTERFACE_BUSY 0x8000
|
||||
#define CANBT_INTERFACE_FLASH_PROG 1
|
||||
#define CANBT_INTERFACE_DATALOG1 2
|
||||
#define CANBT_INTERFACE_DATALOG2 3 // èñïîëüçóåòñÿ äëÿ 32-áèòíîãî äàòàëîããåðà
|
||||
|
||||
struct SCanBTInterface{
|
||||
Uint16 alreadyInit; //ïðèçíàê ïåðâîãî âûçîâà äèñêåòíîãî àâòîìàòà.
|
||||
Uint16 state_shadow;//Òåíåâîå ñîñòîÿíèå.
|
||||
Uint16 state_prev; //Ïðåäûäóùåå ñîñÿíèå (íà îäèí òàêò)
|
||||
Uint16 E; //Ôëàã ïåðâîãî âõîæäåíèÿ.
|
||||
Uint32 time_prev;
|
||||
Uint64 state_time; //âðåìÿ íàõîæäåíèÿ â òåêóùåì ñîñòîÿíèè, â òèêàõ ïðîöà. Äëÿ 150Ìãö ìàêñèìàëüíîå âðåìÿ îêîëî 4òûñ. ëåò :)
|
||||
Uint16 BlockTransferCommand;
|
||||
void (*ms_calc)(volatile struct SCanBTInterface* p, Uint32 time, TCo_OdVars* co_ptr);
|
||||
void (*slow_calc)(volatile struct SCanBTInterface* p);
|
||||
};
|
||||
|
||||
typedef volatile struct SCanBTInterface TCanBTInterface;
|
||||
|
||||
#define T_CANBT_INTERFACE_DEFAULTS {0,CANBT_INTERFACE_FREE,0xFF,1,\
|
||||
0,0,0,\
|
||||
SMCanBTInterface_ms,\
|
||||
SMCanBTInterface_slow}
|
||||
|
||||
void SMCanBTInterface_ms(volatile struct SCanBTInterface* p, Uint32 time, TCo_OdVars* co_ptr);
|
||||
void SMCanBTInterface_slow(volatile struct SCanBTInterface* p);
|
||||
|
||||
//êîëáýêè äëß 2700.00
|
||||
void callback_BTcmd(Uint16 par, Uint16 tag_CANnum);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
170
Vinclude/CANOpen_drv.h
Normal file
170
Vinclude/CANOpen_drv.h
Normal file
@ -0,0 +1,170 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file CANOpen_drv.h
|
||||
\brief Драйвер CANOpen
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 3.19 2019_03_06
|
||||
|
||||
\defgroup CANOpen_drv Драйвер CANOpen
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef CAN_OPEN_DRV_H
|
||||
#define CAN_OPEN_DRV_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
//********************************************************************************************
|
||||
//
|
||||
|
||||
//!Включатель CAN 1
|
||||
#define CAN_1_ENABLE
|
||||
//********************************************************************************************
|
||||
//!Включатель CAN 2
|
||||
//#define CAN_2_ENABLE
|
||||
//********************************************************************************************
|
||||
/*
|
||||
* Функции инициализации драйвера для CAN1 и CAN2
|
||||
* Драйвер использует работу с пользовательской памятью (интерфейс с которой определяется функциями co_UserMemoryRead и co_UserMemoryWrite -
|
||||
* см. файл CANOpenUDfuncs.c), поэтому к моменту начала работы с драйвером пользователь должен ГАРАНТИРОВАТЬ,
|
||||
* что драйвер пользовательской памяти проинициализирован.
|
||||
*/
|
||||
extern Uint16 co1_Init(TCo_OdVars* ppc);//В случае если инициализациЯ не удалась функциЯ возвращает 0, иначе 1.
|
||||
extern Uint16 co2_Init(TCo_OdVars* ppc);//В случае если инициализациЯ не удалась функциЯ возвращают 0, иначе 1.
|
||||
|
||||
//ФункциЯ переинициализации CAN без восстановлениЯ параметров из пользовательской памяти (может быть использована лишь длЯ ПОВТОРНОЙ инициализации)
|
||||
extern Uint16 co_ReInit(TCo_OdVars* ppc);//В случае если инициализациЯ не удалась функциЯ возвращают 0, иначе 1.
|
||||
extern void propReset (void);
|
||||
//Прототипы функций
|
||||
extern void co_UserMemoryRead (const T_UserMemoryContext *p);
|
||||
extern void co_UserMemoryWrite (const T_UserMemoryContext *p);
|
||||
|
||||
#ifdef CAN_1_ENABLE
|
||||
extern void co_CAN1GpioInit();
|
||||
extern void co_CAN1INTEnable();
|
||||
extern void co_CAN1INTDisable();
|
||||
#endif
|
||||
|
||||
#ifdef CAN_2_ENABLE
|
||||
extern void co_CAN2GpioInit();
|
||||
extern void co_CAN2INTDisable();
|
||||
extern void co_CAN2INTEnable();
|
||||
#endif
|
||||
|
||||
|
||||
//!функция драйвера CANOpen вызываемая в прерывании 1 мс таймера, тактирующего работу драйвера
|
||||
extern void co_1ms_calc(TCo_OdVars*);
|
||||
|
||||
//!функция обработчика драйвера CANOpen в фоновой программе
|
||||
extern void co_background_calc(TCo_OdVars*);
|
||||
|
||||
//!Функция восстановления значений параметров словаря объектов по умолчанию
|
||||
/*!
|
||||
Результатом работы функции является восстановление параметров указанного
|
||||
типа и диапазона
|
||||
type - 1 rw-параметры
|
||||
2 rwp-параметры
|
||||
3 rwps-параметры
|
||||
range - 1 восстановление индексов 1000h-1FFFh
|
||||
2,3,4,5
|
||||
Функция по времени выполнения относится к длиным (вызывать следует в фоне) */
|
||||
extern void co_ODexpositor_instaurationDefault(TCo_OdVars* ppc, Uint16 type, Uint16 range);
|
||||
|
||||
//!Функция сохранения значений параметров словаря объектов в ЭнОЗУ
|
||||
/*!Результатом работы функции является сохранение параметров указанного
|
||||
типа и диапазона
|
||||
type - 1 rw-параметры
|
||||
2 rwp-параметры
|
||||
3 rwps-параметры
|
||||
range - 1 восстановление индексов 1000h-1FFFh
|
||||
2,3,4,5
|
||||
Функция по времени выполнения относится к длиным (вызывать следует в фоне).*/
|
||||
extern void co_ODexpositor_paramConservation(TCo_OdVars* ppc, Uint16 type, Uint16 range);
|
||||
|
||||
//!Функция восстановления значений параметров словаря объектов из ЭнОЗУ
|
||||
/*! Результатом работы функции является восстановление параметров указанного
|
||||
типа и диапазона
|
||||
type - 1 rw-параметры
|
||||
2 rwp-параметры
|
||||
3 rwps-параметры
|
||||
range - 1 восстановление индексов 1000h-1FFFh
|
||||
2,3,4,5
|
||||
Внимание!!!Восстановление параметров 2-го и 3-го типов возможно если
|
||||
переменная co_protectBit = 0. Если co_protectBit = 1 , то функция ничего
|
||||
не "делает".
|
||||
Если восстановление параметров заданного типа и диапазона произошло
|
||||
неудачно(контрольная сумма не сошлась), то восстановление заданного
|
||||
типа и диапазона повторяется.Если после трех попыток восстановление
|
||||
не завершилось успехом, то выполняется восстановление параметров заданного
|
||||
типа и диапазона по умолчанию.
|
||||
Функция по времени выполнения относится к длиным (вызывать следует в фоне).*/
|
||||
extern void co_ODexpositor_paramInstauration(TCo_OdVars* ppc, Uint16 type, Uint16 range);
|
||||
|
||||
// функции сервиса NMT
|
||||
// драйвер может выступать NMT мастером, либо быть NMT слэйвом
|
||||
//! функция для отправки NMT (нужна только для NMT мастера)
|
||||
void co_sendNMT(TCo_OdVars* ppc, Uint16 nmtCommand, Uint16 nmtNODE_ID);
|
||||
|
||||
//!функция ПОЛЬЗОВАТЕЛя для отправки SDO запросов на чтение параметров сервера
|
||||
extern void co_SDOrequestRead(TCo_OdVars*);
|
||||
//!функция ПОЛЬЗОВАТЕЛя для отправки SDO запросов на запись параметров сервера
|
||||
extern void co_SDOrequestWrite(TCo_OdVars*);
|
||||
|
||||
extern void Z_co_receiveSDOrequest(TCo_OdVars*, TZCanMsg*);
|
||||
extern void co_CANToExtInterface_Send(TZCanMsg* MSG, Uint16 tag_CANnum);
|
||||
|
||||
/*!ФункциЯ возвращает адрес переменной по переданным индексу
|
||||
и подындексу. Если "свЯзаннаЯ" переменнаЯ 32-х разрЯднаЯ, то
|
||||
возвращаетсЯ указатель на старшую часть.
|
||||
ВНИМАНИЕ!!!Если запрошенного индекса и подиндекса не существует, то
|
||||
функциЯ возвращает 0 (это нужно обЯзательно отслеживать). */
|
||||
extern Uint16 * co_getAddr(TCo_OdVars* ppc, Uint32 ind_subind);
|
||||
// Функция получения информации об объекте с заданным адресом.
|
||||
// Возвращает 0, если объект не найден.
|
||||
extern Uint16 co_getObjectInfo(
|
||||
TCo_OdVars* ppc, // указатель на структуру используемого модуля CANopen
|
||||
Uint32 ind_subind, // биты 16-31 - индекс, биты 0-7 - подындекс объекта
|
||||
TObjectInfo* pObjectInfo // указатель на структуру, куда будет помещена информация об объекте
|
||||
);
|
||||
|
||||
extern void co_RPDO1_Callback(Uint16 nodeID, Uint16 tag_CANnum);
|
||||
extern void co_RPDO2_Callback(Uint16 nodeID, Uint16 tag_CANnum);
|
||||
extern void co_RPDO3_Callback(Uint16 nodeID, Uint16 tag_CANnum);
|
||||
extern void co_RPDO4_Callback(Uint16 nodeID, Uint16 tag_CANnum);
|
||||
extern void co_RPDO5_Callback(Uint16 nodeID, Uint16 tag_CANnum);
|
||||
extern void co_RPDO6_Callback(Uint16 nodeID, Uint16 tag_CANnum);
|
||||
extern void co_RPDO7_Callback(Uint16 nodeID, Uint16 tag_CANnum);
|
||||
extern void co_RPDO8_Callback(Uint16 nodeID, Uint16 tag_CANnum);
|
||||
|
||||
|
||||
//функции ПОЛЬЗОВАТЕЛя, инициирующие передачу, или прием блока данных посредством
|
||||
//сервиса блочной передачи
|
||||
extern void CANBlockTransferInitTX(TCo_OdVars* ppc, Uint16 size, Uint16* source_ptr);
|
||||
extern void CANBlockTransferInitRX(TCo_OdVars* ppc, Uint16 size, Uint16* dest_ptr);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
83
Vinclude/DRV_INTERFACE.h
Normal file
83
Vinclude/DRV_INTERFACE.h
Normal file
@ -0,0 +1,83 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file DRV_INTERFACE.h
|
||||
\brief ×åðåç äàííûå ìîäóëü îáåñïå÷èâàåòñß ðàáîòà ñ áàíêîì àâàðèé (÷òåíèå, î÷èñòêà).
|
||||
//Ïðåäïîëàãàåòñß, ÷òî ìîäóëü ìîæåò ðàñøèðßòü ôóíêöèîíàëüíîñòü (ñêà÷èâàòü êàèå-òî äðóãèå äàííûå)...
|
||||
//ÏÐÈÌÅ×ÀÍÈÅ äëÿ ïðîãðàììèñòà:
|
||||
1.äëÿ êîìàíä ðàáîòàþùèõ ïî ñåòè ñ àâòîìàòèçèðîâàííûìè ñèñòåìàìè (Þíèêîí,, ïóëüòû è ò.ä.) ïîñëå âûïîëíåíèÿ êîìàíäû ïîëå ans_data äîëæíî áûòü óñòàíîâëåíî çíà÷åíèåì çàïðîñà:
|
||||
p->ans_data = temp;
|
||||
÷òî ñîîáùèò âíåøíåé ñèñòåìå, ÷òî çàïðîñ îáðàáîòàí.  ýòîì ñëó÷àå ïîëå p->ans_data îáíóëÿåòñÿ âíåøíåé àâòîìàòèçèðîâàííîé ñèñòåìîé ïîñëå ñáîðà èíôîðìàöèè ñ ïîëåé
|
||||
p->data_Low
|
||||
p->data_High
|
||||
2.äëÿ âíóòðåííèõ âûçîâîâ ïîëå p->ans_data òðîãàòü íå íóæíî
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.1 2017_07_24
|
||||
|
||||
*/
|
||||
// ïðèìåð èñïîëüçîâàíèß â ìîäóëå main
|
||||
#ifndef DRV_INTERFACE_H
|
||||
#define DRV_INTERFACE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#define DRV_INTERFACE_RESET_TIME 10 //âûäåðæêà â ñåê ïåðåä îáíóëåíèåì ïàðàìåòðà Ans_Data
|
||||
|
||||
//!çàïðîñ íà ÷òåíèå àâàðèè
|
||||
#define DATA_REQUEST_READ_FAULT 1
|
||||
//!çàïðîñ íà çàïèñü àâàðèè
|
||||
#define DATA_REQUEST_WRITE_FAULT 2
|
||||
//!çàïðîñ íà çàïèñü ðàáî÷åãî âðåìåíè
|
||||
#define DATA_REQUEST_WRITE_WORK_TIME 3
|
||||
//!çàïðîñ íà ÷òåíèå ðàáî÷åãî âðåìåíè
|
||||
#define DATA_REQUEST_READ_WORK_TIME 4
|
||||
#define DATA_REQUEST_WRITE_OPER_TIME 5
|
||||
//!çàïðîñ íà ÷òåíèå âðåìåíè âî âêëþ÷åííîì ñîñòîßíèè
|
||||
#define DATA_REQUEST_READ_OPER_TIME 6
|
||||
//!î÷èñòêà âñåãî
|
||||
#define DATA_REQUEST_CLEAR_ALL 10
|
||||
|
||||
|
||||
struct SDrvInterface
|
||||
{
|
||||
long req_data;
|
||||
long ans_data;
|
||||
long data_High;
|
||||
long data_Low;
|
||||
|
||||
long INTERFACE_time_sec;//!<
|
||||
long INTERFACE_delta_time_sec;//!<
|
||||
void (*calc)(struct SDrvInterface*);
|
||||
};
|
||||
|
||||
typedef struct SDrvInterface TDrvInterface;
|
||||
|
||||
#define DRV_INTERFACE_DEFAULTS {0,0,0,0,\
|
||||
0,0,\
|
||||
DRV_INTERFACE_Calc,\
|
||||
}
|
||||
|
||||
void DRV_INTERFACE_Calc(TDrvInterface*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
68
Vinclude/DSP.h
Normal file
68
Vinclude/DSP.h
Normal file
@ -0,0 +1,68 @@
|
||||
/******************************************************************************
|
||||
* @file DSP.h
|
||||
* @brief Файл подключения заголовочных файлов периферии и объявления системных констант
|
||||
* @version v1.0
|
||||
* @date 11 декабря 2015
|
||||
*
|
||||
* @note
|
||||
* ООО "НПФ Вектор", все права защищены. Наш сайт: http://motorcontrol.ru
|
||||
*
|
||||
* @par
|
||||
* ООО "НПФ Вектор" распространяет это программное обеспечение в демонстрационных
|
||||
* целях, и оно может распространяться свободно.
|
||||
*
|
||||
* @par
|
||||
* Данное программное обеспечение распространяется "как есть", и Вы,
|
||||
* его пользователь, принимаете на себя все риски, связанные с его использованием.
|
||||
* ООО "НПФ Вектор" не несет никакой ответственности за возможные убытки,
|
||||
* связанные с его использованием.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef VINCLUDE_DSP_H_
|
||||
#define VINCLUDE_DSP_H_
|
||||
|
||||
#define __CM4_REV 0x0001 //в K1921VK01T.h есть объявление __CM4F_REV, но в core_cm4.h проверяется именно __CM4_REV. Если не объявлено там объявляется нулем и больше нигде, вроде, не используется эта константа
|
||||
#define __CHECK_DEVICE_DEFINES
|
||||
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "K1921VK035.h"
|
||||
#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */
|
||||
#include <string.h> //для memcpy
|
||||
#include "EPwm_defines.h"
|
||||
|
||||
typedef char int8;
|
||||
typedef unsigned char Uint8;
|
||||
typedef unsigned short int Uint16;
|
||||
typedef unsigned int Uint32;
|
||||
typedef short int int16;
|
||||
typedef int int32;
|
||||
typedef unsigned long long Uint64;
|
||||
typedef long long int64;
|
||||
|
||||
//Указатели на секцию памяти fastcode, где лежат функции для копирования из флеша в оперативку.
|
||||
//Определены в файле компоновки памяти.
|
||||
extern int __fastcode_ram_start;
|
||||
extern int __fastcode_ram_end;
|
||||
extern int __fastcode_flash_start;
|
||||
|
||||
extern int __isr_vector_flash_start;
|
||||
extern int __isr_vector_ram_start;
|
||||
extern int __isr_vector_ram_end;
|
||||
|
||||
//! Запрет прерываний
|
||||
#define DINT __disable_irq()
|
||||
//! Разрешение прерываний
|
||||
#define EINT __enable_irq()
|
||||
|
||||
#define IRQ_PRIORITY_TZ 1
|
||||
#define IRQ_PRIORITY_ADC 2
|
||||
#define IRQ_PRIORITY_10K 3
|
||||
#define IRQ_PRIORITY_CAP 4
|
||||
#define IRQ_PRIORITY_CAN 5
|
||||
#define IRQ_PRIORITY_1K 6
|
||||
#define IRQ_PRIORITY_EQEP 6
|
||||
|
||||
#endif /* VINCLUDE_DSP_H_ */
|
183
Vinclude/EPwm_defines.h
Normal file
183
Vinclude/EPwm_defines.h
Normal file
@ -0,0 +1,183 @@
|
||||
/******************************************************************************
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
* @file EPwm_defines.h
|
||||
* @brief Ôàéë îáúÿâëåíèÿ ñèñòåìíûõ êîíñòàíò äëÿ ðàáîòû ñ ØÈÌ ìîäóëÿìè
|
||||
* @author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
* @version v1.0
|
||||
* @date 11 äåêàáðÿ 2015
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef EPWM_DEFINES_H
|
||||
#define EPWM_DEFINES_H
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// TBCTL (Time-Base Control)
|
||||
|
||||
|
||||
// CTRMODE bits
|
||||
#define TB_COUNT_UP 0x0
|
||||
#define TB_COUNT_DOWN 0x1
|
||||
#define TB_COUNT_UPDOWN 0x2
|
||||
#define TB_FREEZE 0x3
|
||||
|
||||
// PHSEN bit
|
||||
#define TB_DISABLE 0x0
|
||||
#define TB_ENABLE 0x1
|
||||
|
||||
// PRDLD bit
|
||||
#define TB_SHADOW 0x0
|
||||
#define TB_IMMEDIATE 0x1
|
||||
|
||||
// SYNCOSEL bits
|
||||
#define TB_SYNC_IN 0x0
|
||||
#define TB_CTR_ZERO 0x1
|
||||
#define TB_CTR_CMPB 0x2
|
||||
#define TB_SYNC_DISABLE 0x3
|
||||
|
||||
// HSPCLKDIV and CLKDIV bits
|
||||
#define TB_DIV1 0x0
|
||||
#define TB_DIV2 0x1
|
||||
#define TB_DIV4 0x2
|
||||
|
||||
// PHSDIR bit
|
||||
#define TB_DOWN 0x0
|
||||
#define TB_UP 0x1
|
||||
|
||||
// CMPCTL (Compare Control)
|
||||
|
||||
// LOADAMODE and LOADBMODE bits
|
||||
#define CC_CTR_ZERO 0x0
|
||||
#define CC_CTR_PRD 0x1
|
||||
#define CC_CTR_ZERO_PRD 0x2
|
||||
#define CC_LD_DISABLE 0x3
|
||||
|
||||
// SHDWAMODE and SHDWBMODE bits
|
||||
#define CC_SHADOW 0x0
|
||||
#define CC_IMMEDIATE 0x1
|
||||
|
||||
|
||||
// AQCTLA and AQCTLB (Action Qualifier Control)
|
||||
|
||||
// ZRO, PRD, CAU, CAD, CBU, CBD bits
|
||||
#define AQ_NO_ACTION 0x0
|
||||
#define AQ_CLEAR 0x1
|
||||
#define AQ_SET 0x2
|
||||
#define AQ_TOGGLE 0x3
|
||||
|
||||
// DBCTL (Dead-Band Control)
|
||||
|
||||
// OUT MODE bits
|
||||
#define DB_DISABLE 0x0
|
||||
#define DBA_ENABLE 0x1
|
||||
#define DBB_ENABLE 0x2
|
||||
#define DB_FULL_ENABLE 0x3
|
||||
|
||||
// POLSEL bits
|
||||
#define DB_ACTV_HI 0x0
|
||||
#define DB_ACTV_LOC 0x1
|
||||
#define DB_ACTV_HIC 0x2
|
||||
#define DB_ACTV_LO 0x3
|
||||
|
||||
// IN MODE
|
||||
#define DBA_ALL 0x0
|
||||
#define DBB_RED_DBA_FED 0x1
|
||||
#define DBA_RED_DBB_FED 0x2
|
||||
#define DBB_ALL 0x3
|
||||
|
||||
// CHPCTL (chopper control)
|
||||
|
||||
// CHPEN bit
|
||||
#define CHP_DISABLE 0x0
|
||||
#define CHP_ENABLE 0x1
|
||||
|
||||
// CHPFREQ bits
|
||||
#define CHP_DIV1 0x0
|
||||
#define CHP_DIV2 0x1
|
||||
#define CHP_DIV3 0x2
|
||||
#define CHP_DIV4 0x3
|
||||
#define CHP_DIV5 0x4
|
||||
#define CHP_DIV6 0x5
|
||||
#define CHP_DIV7 0x6
|
||||
#define CHP_DIV8 0x7
|
||||
|
||||
// CHPDUTY bits
|
||||
#define CHP1_8TH 0x0
|
||||
#define CHP2_8TH 0x1
|
||||
#define CHP3_8TH 0x2
|
||||
#define CHP4_8TH 0x3
|
||||
#define CHP5_8TH 0x4
|
||||
#define CHP6_8TH 0x5
|
||||
#define CHP7_8TH 0x6
|
||||
|
||||
// TZSEL (Trip Zone Select)
|
||||
//==========================
|
||||
// CBCn and OSHTn bits
|
||||
#define TZ_DISABLE 0x0
|
||||
#define TZ_ENABLE 0x1
|
||||
|
||||
// TZCTL (Trip Zone Control)
|
||||
//==========================
|
||||
// TZA and TZB bits
|
||||
#define TZ_HIZ 0x0
|
||||
#define TZ_FORCE_HI 0x1
|
||||
#define TZ_FORCE_LO 0x2
|
||||
#define TZ_NO_CHANGE 0x3
|
||||
|
||||
// ETSEL (Event Trigger Select)
|
||||
//=============================
|
||||
#define ET_CTR_ZERO 0x1
|
||||
#define ET_CTR_PRD 0x2
|
||||
#define ET_CTRU_CMPA 0x4
|
||||
#define ET_CTRD_CMPA 0x5
|
||||
#define ET_CTRU_CMPB 0x6
|
||||
#define ET_CTRD_CMPB 0x7
|
||||
|
||||
// ETPS (Event Trigger Pre-scale)
|
||||
//===============================
|
||||
// INTPRD, SOCAPRD, SOCBPRD bits
|
||||
#define ET_DISABLE 0x0
|
||||
#define ET_1ST 0x1
|
||||
#define ET_2ND 0x2
|
||||
#define ET_3RD 0x3
|
||||
|
||||
|
||||
//--------------------------------
|
||||
// HRPWM (High Resolution PWM)
|
||||
//================================
|
||||
// HRCNFG
|
||||
#define HR_Disable 0x0
|
||||
#define HR_REP 0x1
|
||||
#define HR_FEP 0x2
|
||||
#define HR_BEP 0x3
|
||||
|
||||
#define HR_CMP 0x0
|
||||
#define HR_PHS 0x1
|
||||
|
||||
#define HR_CTR_ZERO 0x0
|
||||
#define HR_CTR_PRD 0x1
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* extern "C" */
|
||||
|
||||
#endif
|
||||
|
196
Vinclude/Global_time.h
Normal file
196
Vinclude/Global_time.h
Normal file
@ -0,0 +1,196 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file Global_time.h
|
||||
\brief Ìîäóëü ðàáîòû ñî âðåìåíåì
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.1 2010_02_24
|
||||
|
||||
*/
|
||||
|
||||
#ifndef GLOBAL_TIME_H
|
||||
#define GLOBAL_TIME_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include "DSP.h"
|
||||
|
||||
#define GLOBAL_TIME_CALC_FREQ 10 //!<êÃö ÷àñòîòà âûçîâà ôóíêöèè calc
|
||||
//#define USE_ABSOLUTE_TIME_CLOCK //ðàñêîìåíòèðîâàòü åñëè èñïîëüçóþòñß ÷àñû ðåàëüíîãî âðåìåíè
|
||||
|
||||
|
||||
|
||||
#define GLOBAL_TIME_SPI_START_ADDR 6500 //!<íà÷àëüíûé àäðåñ â SPI
|
||||
|
||||
#define GLOBAL_TIME_POWER_ON_TIME_ADDR GLOBAL_TIME_SPI_START_ADDR
|
||||
#define GLOBAL_TIME_OPERATIONAL_TIME_ADDR GLOBAL_TIME_SPI_START_ADDR + 4
|
||||
|
||||
|
||||
//!Àáñîëþòíîå âðåìß
|
||||
struct SABSOLUTE_TIME
|
||||
{
|
||||
int16 second;
|
||||
int16 minute;
|
||||
int16 hour;
|
||||
int16 day;
|
||||
int16 year;
|
||||
};
|
||||
typedef volatile struct SABSOLUTE_TIME ABSOLUTE_TIME;
|
||||
|
||||
//!Îòíîñèòåëüíàß äàòà
|
||||
typedef struct
|
||||
{
|
||||
int16 millisecond;
|
||||
int16 second;
|
||||
int16 minute;
|
||||
int32 hour;
|
||||
}RELATIVE_DATE;
|
||||
|
||||
|
||||
//!Îòíîñèòåëüíîå âðåìß
|
||||
struct SRELATIVE_TIME
|
||||
{
|
||||
int ON;
|
||||
Uint32 tic_isr;
|
||||
Uint32 millisecond_counter;
|
||||
Uint32 second_counter;
|
||||
int16 delta_millisecond;
|
||||
int16 delta_second;
|
||||
RELATIVE_DATE relative_date;
|
||||
};
|
||||
typedef volatile struct SRELATIVE_TIME RELATIVE_TIME;
|
||||
|
||||
|
||||
|
||||
/*! \class TGlobalTime
|
||||
\brief Ìîäóëü ðàáîòû ñî âðåìåíåì.
|
||||
|
||||
Êëàññ \a TGlobalTime, îñíîâàííûé íà ñòðóêòóðå SGlobalTime, ñîäåðæèò ìåòîäû
|
||||
äëß ðàáîòû ñî âðåìåíåì.Îòñ÷èòûâàåò âðåìß â:\n
|
||||
äëß îòñ÷åòà âðåìåíè ðàáîòû è ò.ä.:\n
|
||||
ìèëèñåêóíäû: 0-999\n
|
||||
ñåêóíäû: 0-59\n
|
||||
ìèíóòû: 0-59\n
|
||||
÷àñû: 0-23\n
|
||||
äíè: 0-364\n
|
||||
ãîäà: 0-ïðèìåðíî äî 160 ëåò\n
|
||||
äëß îòñ÷åòà äåëüò (ïðèðàùåíèé âðåìåíè):\n
|
||||
ìèëèñåêóíäû: 0-0xFFFFFFFF - ñîîòâåòñòâóåò ïðèìåðíî 1.5 ìåñßöàì\n
|
||||
ñåêóíäû: 0-0xFFFFFFFF - ñîîòâåòñòâóåò ïðèìåðíî 160 ãîäàì\n
|
||||
|
||||
Åñòü ñïåöèàëüíûé ñïîñîá, ïîçâîëßþùèé îòñ÷èòûâàòü âûäåðæêè âðåìåíè ñ òî÷íîñòüþ
|
||||
äî ìèëëèñåêóíä â ïåðûâàíèè ØÈÌ. Èñïîëüçóåòñß ïåðåìåííàß delta_millisecond,
|
||||
êîòîðàß âîçâîäèòñß â åäèíèöó êàæäóþ ìèëëèñåêóíäó è íà ñëåäóþùåì ïåðèîäå ØÈÌ
|
||||
ñáðàñûâàåòñß. Òîãäà ìîæíî â íåîáõîäèìûé ñ÷åò÷èê äîáàâèòü counter+=delta_millisecond è
|
||||
ïîëó÷èòü â counter ñ÷åò÷èê ìèëëèñåêóíä. Àíàëîãè÷íî delta_second.
|
||||
|
||||
ÏÐÈÌÅ×ÀÍÈÅ: 1. ìîäóëü íå òðåáóåò èíèöèàëèçàöèè
|
||||
2. àâòîìàòè÷åñêè ïåðåíàñòðàèâàåòñß ïðè èçìåíåíèè íåñóùåé ÷àñòîòû
|
||||
|
||||
ÄËß ÊÎÐÐÅÊÒÍÎÉ ÐÀÁÎÒÛ ÌÎÄÓËß ÏÎËÜÇÎÂÀÒÅËÜ ÄÎËÆÅÍ:
|
||||
1. â ìàêðîñå GLOBAL_TIME_CALC_FREQ ïðàâèëüíî óêàçàòü íåñóùóþ ÷àñòîòó âûçîâà ôóíêöèè ðàñ÷åòà.
|
||||
Ñëåäóåò îòìåòèòü, ÷òî çíà÷åíèå GLOBAL_TIME_CALC_FREQ öåëî÷èñëåííîå, ïîýòîìó
|
||||
ìîäóëü êîððåêòíî ðàáîòàåò òîëüêî ïðè öåëûõ çíà÷åíèßõ íåñóùåé ÷àñòîòû (â êÃö).
|
||||
Íåäîñòàòîê ñâßçàí ñ êîíêðåòíîé ðåàëèçàöèåé ìîäóëß.
|
||||
*/
|
||||
|
||||
//! ñì. TGlobalTime
|
||||
struct SGlobalTime
|
||||
{
|
||||
RELATIVE_TIME relative_time1;//!îòíîñèòåëüíîå âðåìß 1
|
||||
RELATIVE_TIME relative_time2;//!îòíîñèòåëüíîå âðåìß 2
|
||||
ABSOLUTE_TIME absolute_time;//!àáñîëþòíîå âðåìß
|
||||
int16 time_type;//!÷àñû ðåàëüíîãî âðåìåíè (1 - åñòü)
|
||||
int32 PowerOn_time; //!<Îáùåå âðåìß íàðàáîòêè
|
||||
int32 PowerOn_time_min; //!<Îáùåå âðåìß íàðàáîòêè â ìèíóòàõ
|
||||
int32 operational_time; //!<Îáùåå âðåìß âêëþ÷åííîãî ñîñòîßíèß
|
||||
int32 operational_time_min; //!<Îáùåå âðåìß âêëþ÷åííîãî ñîñòîßíèß â ìèíóòàõ
|
||||
int16 WtiteSPI_flag;
|
||||
int32 PrevWriteSPIHour;
|
||||
void (*init)(volatile struct SGlobalTime*);
|
||||
void (*calc)(volatile struct SGlobalTime*);
|
||||
void (*ms_calc)(volatile struct SGlobalTime*);
|
||||
void (*slow_calc)(volatile struct SGlobalTime*);
|
||||
void (*read_PowerOn_time)(volatile struct SGlobalTime*);
|
||||
void (*write_PowerOn_time)(volatile struct SGlobalTime*);
|
||||
void (*read_oper_time) (volatile struct SGlobalTime*);
|
||||
void (*write_oper_time)(volatile struct SGlobalTime*);
|
||||
};
|
||||
|
||||
typedef volatile struct SGlobalTime TGlobalTime;
|
||||
|
||||
//!Èíèöàëèçàòîð îòíîñèòåëüíîé äàòû.
|
||||
#define RELATIVE_DATE_DEFAULTS {0,0,0,0}
|
||||
|
||||
//!Èíèöèàëèçàòîð îòíîñèòåëüíîãî âðåìåíè.
|
||||
#define RELATIVE_TIME_DEFAULTS {0,\
|
||||
0,0,0,0,0,\
|
||||
RELATIVE_DATE_DEFAULTS,\
|
||||
}
|
||||
//!Èíèöèàëèçàòîð àáñîëþòíîãî âðåìåíè.
|
||||
#define ABSOLUTE_TIME_DEFAULTS {0,0,0,0,0}
|
||||
|
||||
//!Èíèöèàëèçàòîð TGlobalTime.
|
||||
#define GLOBAL_TIME_DEFAULTS { RELATIVE_TIME_DEFAULTS,\
|
||||
RELATIVE_TIME_DEFAULTS,\
|
||||
ABSOLUTE_TIME_DEFAULTS,\
|
||||
1,0,0,0,0,0,0,\
|
||||
GlobalTime_init,\
|
||||
GlobalTime_calc,\
|
||||
GlobalTime_ms_calc,\
|
||||
GlobalTime_slow_calc,\
|
||||
GlobalTime_read_PowerOn_time, \
|
||||
GlobalTime_write_PowerOn_time, \
|
||||
GlobalTime_read_oper_time, \
|
||||
GlobalTime_write_oper_time,\
|
||||
}
|
||||
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_init(TGlobalTime*);
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_calc(TGlobalTime*);
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_ms_calc(TGlobalTime*);
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_slow_calc(TGlobalTime*);
|
||||
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_REL_TIME_calc(RELATIVE_TIME *p);
|
||||
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_read_PowerOn_time(TGlobalTime*);
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_write_PowerOn_time(TGlobalTime*);
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_read_oper_time(TGlobalTime*);
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_write_oper_time(TGlobalTime*);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
96
Vinclude/SM_CmdLogic.h
Normal file
96
Vinclude/SM_CmdLogic.h
Normal file
@ -0,0 +1,96 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMCmdLogic.h
|
||||
\brief Îáðàáîòêà êîìàíä è çàäàíèé, ïîñòóïàþùèõ èç ðàçëè÷íûõ èñòî÷íèêîâ. (ñì. TSM_CmdLogic)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup SMCmdLogic Îáðàáîòêà êîìàíä è çàäàíèé, ïîñòóïàþùèõ èç ðàçëè÷íûõ èñòî÷íèêîâ. (ñì. TSM_CmdLogic)
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
#ifndef SM_CmdLogicH
|
||||
#define SM_CmdLogicH
|
||||
|
||||
#include "V_common.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
//! Ñèñòåìà îñòàíîâëåíà, ãîòîâà ê çàïóñêó (ÃÎÒÎÂ)
|
||||
#define CMD_LOGIC_TURNED_OFF 0x0
|
||||
//! Ñîñòîÿíèå ÐÀÁÎÒÀ
|
||||
#define CMD_LOGIC_TURNED_ON 0x2
|
||||
|
||||
/*! \class TSM_CmdLogic
|
||||
\brief Îáðàáîòêà êîìàíä è çàäàíèé, ïîñòóïàþùèõ èç ðàçëè÷íûõ èñòî÷íèêîâ.
|
||||
|
||||
Êëàññ \a TSM_CmdLogic, îñíîâàííûé íà ñòðóêòóðå SSMCmdLogic, ñëóæèò äëÿ îáðàáîòêè êîìàíä
|
||||
îïåðàòèâíîãî óïðàâëåíèÿ è çàäàíèÿ ñêîðîñòè. Êîìàíäû ìîãóò ïîñòóïàòü êàê ïî CANOpen,
|
||||
òàê è ïî äðóãèì ïðîòîêîëàì (ModBus). Ñîäåðæèò äèñêðåòíûé àâòîìàò, êîòîðûé ïåðåêëþ÷àåò
|
||||
ñèñòåìó ìåæäó ñîñòîÿíèÿìè ÐÀÁÎÒÀ è ÎÑÒÀÍÎÂ (ÃÎÒÎÂ).
|
||||
*/
|
||||
|
||||
//! ñì. TSM_CmdLogic
|
||||
struct SSM_CmdLogic
|
||||
{
|
||||
int state;//!<Cîñòîÿíèå
|
||||
int state_prev;//!<Ïðåäûäóùåå ñîñòîÿíèå
|
||||
int E;//!<Ôëàã ïåðâîãî âõîæäåíèÿ
|
||||
TCmd cmd_by_level_prev;//!<Ïðåäûäóùåå ñîñòîÿíèå êîìàíäíîãî ñëîâà
|
||||
int ReRunCounter;//!< Ñ÷åò÷èê âðåìåíè ñ ìîìåíòà ïðåäûäóùåãî çàïóñêà ñèñòåìû
|
||||
int StartButtonPrev;
|
||||
int StartButton;
|
||||
int StopButtonPrev;
|
||||
int StopButton;
|
||||
void (*init)(volatile struct SSM_CmdLogic*);//!< Pointer to the init funcion
|
||||
void (*slow_calc)(volatile struct SSM_CmdLogic*);//!< Pointer to the calc funtion
|
||||
void (*ms_calc)(volatile struct SSM_CmdLogic*); //!< Pointer to the calc funtion
|
||||
};
|
||||
|
||||
typedef volatile struct SSM_CmdLogic TSM_CmdLogic;
|
||||
|
||||
//! Èíèöèàëèçàòð ïî óìîë÷àíèþ
|
||||
#define SM_CMD_LOGIC_DEFAULTS {0,0,0,{0},0,0,0,0,0,\
|
||||
SM_CmdLogicInit,\
|
||||
SM_CmdLogicSlow_Calc,\
|
||||
SM_CmdLogicms_Calc}
|
||||
|
||||
//! \memberof TSM_CmdLogic
|
||||
void SM_CmdLogicInit(TSM_CmdLogic*);
|
||||
//! \memberof TSM_CmdLogic
|
||||
void SM_CmdLogicSlow_Calc(TSM_CmdLogic*);
|
||||
//! \memberof TSM_CmdLogic
|
||||
void SM_CmdLogicms_Calc(TSM_CmdLogic*);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
94
Vinclude/SM_Ctrl.h
Normal file
94
Vinclude/SM_Ctrl.h
Normal file
@ -0,0 +1,94 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMCtrl.h
|
||||
\brief Îñíîâíîé ÄÀ ïåðåêëþ÷åíèÿ ñèñòåì óïðàâëåíèÿ (ñì. TSM_Ctrl)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup SMCtrl Îñíîâíîé ÄÀ ïåðåêëþ÷åíèÿ ñèñòåì óïðàâëåíèÿ (ñì. TSM_Ctrl)
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef SM_Ctrl_H
|
||||
#define SM_Ctrl_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
/*! \class TSM_Ctrl
|
||||
\brief Îñíîâíîé ÄÀ ïåðåêëþ÷åíèÿ ñèñòåì óïðàâëåíèÿ
|
||||
|
||||
Êëàññ \a TSM_Ctrl, îñíîâàííûé íà ñòðóêòóðå SSMCtrl, ñîäåðæèò
|
||||
îñíîâíîé äèñêðåòíûé àâòîìàò ïåðåêëþ÷åíèÿ ñèñòåì óïðàâåëíèÿ.  êàæäîì èç
|
||||
ñîñòîÿíèé äàííîãî àâòîìàòà ðåàëèçîâàíà òà èëè èíàÿ ñòðóêòóðà óïðàâëåíèÿ.
|
||||
Ñòðóêòóðà ñîáèðàåòñÿ èç ãîòîâûõ áëîêîâ. Îáû÷íî èñïîëüçóåñÿ ìîäóëü ØÈÌ,
|
||||
ôàçíûå è êîîðäèíàòíûå ïðåîáðàçîâàíèÿ, ÀÖÏ, ÇÈ è ò.ï. Ñòðóêòóðû óïðàâëåíèÿ ìîãóò áûòü:
|
||||
ñêàëÿðíîå óïðàâëåíèå, çàìêíóòàÿ ïî òîêó ñèñòåìà óïðàâëåíèÿ, âåêòîðíîå óïðàâëåíèå è ò.ï.
|
||||
 run_mode çàäàåòñÿ íîìåð æåëàåìîé ñòðóêòóðû óïðàâëåíèÿ.
|
||||
*/
|
||||
|
||||
//! ñì. TSM_Ctrl
|
||||
|
||||
struct SSM_Ctrl
|
||||
{
|
||||
long ctrl_counter;//!<Ñ÷åò÷èê âðåìåíè íàõîæäåíèÿ â îäíîì ñîñòîÿíèè
|
||||
long run_mode;//!Çàäàííûé ðåæèì ðàáîòû (çàäàííîå ñîñòîÿíèå). Âåêòîðíîå óïðàâëåíèå, ñêàëÿðíîå, ïîñòîÿííûé òîê è ò.ï.
|
||||
int state;//!<Ñîñòîÿíèå äèñêðåòíîãî àâòîìàòà - îíî æå òåêóùàÿ ñòðóêòóðà óïðàâëåíèÿ.
|
||||
int state_prev;//!<Ïðåäûäóùåå ñîñòîÿíèå
|
||||
int E;//!<Ôëàã ïåðâîãî âõîæäåíèÿ.
|
||||
long AnglePrev;//!< Ïðåäûäóùåå çíà÷åíèå óãëà äëÿ ðåæèìà àâòîíàñòðîéêè ÄÏÐ
|
||||
long AngleDemo;//!< Óãîë äëÿ äåìî-ðåæèìà êîíòóðà ïîëîæåíèÿ
|
||||
void (*init)(struct SSM_Ctrl*); //!< Pointer to the init funcion
|
||||
void (*slow_calc)(struct SSM_Ctrl*);//!< Pointer to the calc funtion
|
||||
void (*fast_calc)(struct SSM_Ctrl*); //!< Pointer to the calc funtion
|
||||
void (*ms_calc)(struct SSM_Ctrl*); //!< Pointer to the calc funtion
|
||||
} ;
|
||||
|
||||
typedef struct SSM_Ctrl TSM_Ctrl;
|
||||
|
||||
//!Èíèöèàëèçàòîð ïî óìîë÷àíèþ
|
||||
#define SM_CTRL_DEFAULTS {0,0,0,0,0,0,0,\
|
||||
SM_Ctrl_Init,\
|
||||
SM_Ctrl_Slow_Calc,\
|
||||
SM_Ctrl_Fast_Calc,\
|
||||
SM_Ctrl_ms_Calc,\
|
||||
}
|
||||
|
||||
//! \memberof TSM_Ctrl
|
||||
void SM_Ctrl_Init(TSM_Ctrl*);
|
||||
//! \memberof TSM_Ctrl
|
||||
void SM_Ctrl_Slow_Calc(TSM_Ctrl*);
|
||||
//! \memberof TSM_Ctrl
|
||||
void SM_Ctrl_Fast_Calc(TSM_Ctrl*);
|
||||
//! \memberof TSM_Ctrl
|
||||
void SM_Ctrl_ms_Calc(TSM_Ctrl*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
93
Vinclude/SM_Net.h
Normal file
93
Vinclude/SM_Net.h
Normal file
@ -0,0 +1,93 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMNet.h
|
||||
\brief Ìîäóëü îáùåãî íàçíà÷åíèÿ äëÿ ðàáîòû ñ ñåòüþ. (ñì. TSM_Net)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup SMNet Ìîäóëü îáùåãî íàçíà÷åíèÿ äëÿ ðàáîòû ñ ñåòüþ. (ñì. TSM_Net)
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef SM_Net_H
|
||||
#define SM_Net_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#define DRV_STATUS_INIT 0x0
|
||||
#define DRV_STATUS_READY 0x1
|
||||
#define DRV_STATUS_RUNNING 0x2
|
||||
#define DRV_STATUS_FAULT 0x3
|
||||
#define DRV_STATUS_TESTING 0x4
|
||||
#define DRV_STATUS_STOPPED 0x5
|
||||
#define DRV_STATUS_AUTO_SET 0x6
|
||||
#define DRV_STATUS_ALARM 0x8
|
||||
|
||||
/*! \class TSM_Net
|
||||
\brief Ìîäóëü îáùåãî íàçíà÷åíèÿ äëÿ ðàáîòû ñ ñåòüþ.
|
||||
|
||||
Êëàññ \a TSM_Net, îñíîâàííûé íà ñòðóêòóðå SSMNet, ñîäåðæèò
|
||||
ìåòîäû îáùåãî íàçíà÷åíèÿ äëÿ ðàáîòû ñ ðàçëè÷íûìè ñåòåâûìè èíòåðôåéñàìè.
|
||||
Âûçîâ ôóíêöèé ðàñ÷åòà êîíêðåòíûõ ñåòåâûõ ìîäóëåé, ðàáîòà ñ ìàñøòàáèðóþùèìè êîýôôèöèåíòàìè è ò.ï.
|
||||
|
||||
*/
|
||||
|
||||
//! ñì. TSM_Net
|
||||
struct SSM_Net
|
||||
{
|
||||
int state; //!<Ñîñòîÿíèå
|
||||
int state_prev;//!<Ñîñòîÿíèå ïðåäûäóùåå
|
||||
int E;//!<Ôëàã ïåðâîãî âõîæäåíèÿ
|
||||
void (*init)(struct SSM_Net*); /* Pointer to the init funcion */
|
||||
void (*slow_calc)(struct SSM_Net*); /* Pointer to the calc funtion */
|
||||
void (*ms_calc)(struct SSM_Net*); /* Pointer to the calc funtion */
|
||||
void (*fast_calc)(struct SSM_Net*); /* Pointer to the calc funtion */
|
||||
} ;
|
||||
typedef struct SSM_Net TSM_Net;
|
||||
|
||||
//!èíèöèàëèçàòîð ïî óìîë÷àíèþ
|
||||
#define SM_NET_DEFAULTS {0,0,0,\
|
||||
SM_Net_Init,\
|
||||
SM_Net_Slow_Calc,\
|
||||
SM_Net_ms_Calc,\
|
||||
SM_Net_fast_Calc,\
|
||||
}
|
||||
|
||||
//! \memberof TSM_Net
|
||||
void SM_Net_Init(TSM_Net*);
|
||||
//! \memberof TSM_Net
|
||||
void SM_Net_Slow_Calc(TSM_Net*);
|
||||
//! \memberof TSM_Net
|
||||
void SM_Net_ms_Calc(TSM_Net*);
|
||||
//! \memberof TSM_Net
|
||||
void SM_Net_fast_Calc(TSM_Net*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
128
Vinclude/SM_Protect.h
Normal file
128
Vinclude/SM_Protect.h
Normal file
@ -0,0 +1,128 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMProtect.h
|
||||
\brief Ìîäóëü çàùèò. (ñì. TSM_Protect)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup SMProtect Ìîäóëü çàùèò. (ñì. TSM_Protect)
|
||||
@{
|
||||
*/
|
||||
#ifndef SM_Protect_H
|
||||
#define SM_Protect_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include "build.h"
|
||||
|
||||
//! Ìîäóëü àùèò âûêëþ÷åí
|
||||
#define PROT_OFF 0
|
||||
//! Ìîäóëü çàùèò âêëþ÷åí
|
||||
#define PROT_ON_OK 1
|
||||
//! Ìîäóëü çàùèò â ñîñòîÿíèè àâàðèè (ñðàáîòàëà çàùèòà)
|
||||
#define PROT_FAIL 2
|
||||
|
||||
//Ìàêðîñ ïðèåìà àïïàðàòíîé àâàðèè èíâåðòîðà: åñëè íîëü, òî àâàðèÿ
|
||||
#define DRV_FAULT (GPIOA->DATA & (1 << 7))
|
||||
|
||||
|
||||
/*! \class TSM_Protect
|
||||
\brief Ìîäóëü çàùèò.
|
||||
|
||||
Êëàññ \a TSM_Protect, îñíîâàííûé íà ñòðóêòóðå SSMProtect,
|
||||
îáðàáàòûâàåò âñå âîçìîæíûå àâàðèéíûå ñèòóàöèè è âîçâîäèò ñîîòâåòñòâóþùèé ýòîé
|
||||
àâàðèè áèò â îäíîì èç ñëîâ bit_fault 1-2. äàëåå ïðîèñõîäèò îáðàáîòêà ýòèõ ñëîâ, è,
|
||||
åñëè ýòà àâàðèÿ íå çàìàñêèðîâàíà, ïðîèñõîäèò îñòàíîâ ïðèâîäà.
|
||||
*/
|
||||
|
||||
//! ñì. TSM_Protect
|
||||
struct SSM_Protect
|
||||
{
|
||||
Uint16 state;//!< Ñîñòîÿíèå
|
||||
Uint16 state_prev;//!< Ñîñòîÿíèå ïðåäûäóùåå
|
||||
|
||||
Uint16 readDrvSts; //!<Ôëàã çàïðîñà ÷òåíèÿ ñòàòóñà drv8301
|
||||
Uint16 clearDrvFault; //!<Ôëàã çàïðîñà ñáðîñà àâàðèè drv8301
|
||||
|
||||
Uint16 bit_fault1;//!<Ñëîâî àâàðèé 1
|
||||
Uint16 bit_fault2;//!<Ñëîâî àâàðèé 2
|
||||
|
||||
Uint16 masked_bit_fault1;//!<Ñëîâî àâàðèé ïîñëå ìàñêèðîâàíèÿ
|
||||
Uint16 masked_bit_fault2;//!<Ñëîâî àâàðèé ïîñëå ìàñêèðîâàíèÿ
|
||||
|
||||
Uint16 mask_fault1;//!<Ìàñêà àâàðèé 1
|
||||
Uint16 mask_fault2;//!<Ìàñêà àâàðèé 2
|
||||
|
||||
Uint16 bit_fault_written1;
|
||||
Uint16 bit_fault_written2;
|
||||
|
||||
long Imax_protect; //!<Óñòàâêà ìàêñèìàëüíî-òîêîâîé çàùèòû
|
||||
long Umax_protect; //!<Óñòàâêà çàùèòû max íàïðÿæåíèÿ íà ÇÏÒ
|
||||
long Umin_protect;//!<Óñòàâêà çàùèòû min íàïðÿæåíèÿ íà ÇÏÒ
|
||||
long speed_max;//!<Óñòàâêà ìàêñèìàëüíîé ñêîðîñòè
|
||||
long T_max;
|
||||
|
||||
int E;//!<Ôëàã ïåðâîãî âõîæäåíèÿ
|
||||
Uint16 Main_ErrorCode;//!< //ëèñòàþùèéñÿ êîä àâàðèè
|
||||
Uint32 Main_Flags;//!< //Ôëàã àâàðèéíîé áëîêèðîâêè áëîêà
|
||||
Uint16 powered_okCounter;//!< Ñ÷åò÷èê äëÿ îæèäàíèÿ âêëþ÷åíÿ ìîäóëÿ çàùèò ïîñëå èíåöèàëèçàöèè
|
||||
void (*init)(struct SSM_Protect*); /* Pointer to the init funcion */
|
||||
void (*slow_calc)(struct SSM_Protect*); /* Pointer to the calc funtion */
|
||||
void (*fast_calc)(struct SSM_Protect*); /* Pointer to the calc funtion */
|
||||
void (*ms_calc)(struct SSM_Protect*); /* Pointer to the calc funtion */
|
||||
} ;
|
||||
typedef struct SSM_Protect TSM_Protect;
|
||||
|
||||
//!Èíèöèàëèçàòîð ïî óìîë÷àíèþ
|
||||
#define SM_PROTECT_DEFAULTS {0,0,\
|
||||
0,0,\
|
||||
0,0,\
|
||||
0,0,\
|
||||
0,0,\
|
||||
0,0,\
|
||||
0,0,0,0,0,\
|
||||
0,0,0,0,\
|
||||
SM_Protect_Init,\
|
||||
SM_Protect_Slow_Calc,\
|
||||
SM_Protect_Fast_Calc,\
|
||||
SM_Protect_ms_Calc,\
|
||||
}
|
||||
|
||||
//! \memberof TSM_Protect
|
||||
void SM_Protect_Init(TSM_Protect*);
|
||||
//! \memberof TSM_Protect
|
||||
void SM_Protect_Slow_Calc(TSM_Protect*);
|
||||
//! \memberof TSM_Protect
|
||||
void SM_Protect_Fast_Calc(TSM_Protect*);
|
||||
//! \memberof TSM_Protect
|
||||
void SM_Protect_ms_Calc(TSM_Protect*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
90
Vinclude/SM_Sys.h
Normal file
90
Vinclude/SM_Sys.h
Normal file
@ -0,0 +1,90 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMSys.h
|
||||
\brief Ìîäóëü-îáåðòêà äëÿ ðàñ÷åòà îñòàëüíûõ ìîäóëåé. (ñì. TSM_Sys)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup SMSys Ìîäóëü-îáåðòêà äëÿ ðàñ÷åòà îñòàëüíûõ ìîäóëåé. (ñì. TSM_Sys)
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef SM_Sys_H
|
||||
#define SM_Sys_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
//! Ñèñòåìà â èíèöèàëèçàöèè
|
||||
#define SYS_INIT 0
|
||||
//! Ñèñòåìà ïðîèíèöèàëèçèðîâàíà
|
||||
#define SYS_READY 1
|
||||
|
||||
|
||||
/*! \class TSM_Sys
|
||||
\brief Ìîäóëü-îáåðòêà äëÿ ðàñ÷åòà îñòàëüíûõ ìîäóëåé.
|
||||
|
||||
Êëàññ \a TSM_Sys, îñíîâàííûé íà ñòðóêòóðå SSMSys, ÿâëÿåòñÿ ìîäóëåì,
|
||||
âíóòðè ìåòîäîâ êîòîðîãî ïðîèñõîäèò âûçîâ áîëüøèíñòâà îñòàëüíûõ. Íàïðèìåð,
|
||||
ôóíêöèÿ áûñòðîãî ðàñ÷åòà äàííîãî ìîäóëÿ âûçûâàåò ôóíêöèè áûñòðîãî ðàñ÷åòà
|
||||
îñòàëüíûõ ìîäóëåé. Êðîìå òîãî, â èíèöèàëèçàöèè äàííîãî ìîäóëÿ íàñòðàèâàþòñÿ ïðåðûâàíèÿ
|
||||
êîíòðîëëåðà.
|
||||
*/
|
||||
|
||||
//! ñì. TSM_Sys
|
||||
struct SSM_Sys
|
||||
{
|
||||
int state;//!< Ñîñòîÿíèå
|
||||
int state_prev;//!< Ñîñòîÿíèå ïðåäûäóùåå
|
||||
int E;//!<Ôëàã ïåðâîãî âõîæäåíèÿ
|
||||
void (*init)(struct SSM_Sys*); /* Pointer to the init funcion */
|
||||
void (*slow_calc)(struct SSM_Sys*); /* Pointer to the calc funtion */
|
||||
void (*fast_calc)(struct SSM_Sys*); /* Pointer to the calc funtion */
|
||||
void (*ms_calc)(struct SSM_Sys*); /* Pointer to the calc funtion */
|
||||
} ;
|
||||
|
||||
typedef struct SSM_Sys TSM_Sys;
|
||||
|
||||
//!Èíèöèàëèçàòîð ïî óìîë÷àíèþ
|
||||
#define SM_Sys_DEFAULTS {0,0,0,\
|
||||
SM_Sys_Init,\
|
||||
SM_Sys_Slow_Calc,\
|
||||
SM_Sys_Fast_Calc,\
|
||||
SM_Sys_ms_Calc,\
|
||||
}
|
||||
|
||||
//! \memberof TSM_Sys
|
||||
void SM_Sys_Init(TSM_Sys*);
|
||||
//! \memberof TSM_Sys
|
||||
void SM_Sys_Slow_Calc(TSM_Sys*);
|
||||
//! \memberof TSM_Sys
|
||||
void SM_Sys_Fast_Calc(TSM_Sys*);
|
||||
//! \memberof TSM_Sys
|
||||
void SM_Sys_ms_Calc(TSM_Sys*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
72
Vinclude/V_AutoOffset.h
Normal file
72
Vinclude/V_AutoOffset.h
Normal file
@ -0,0 +1,72 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_AutoOffset.h (IQ version)
|
||||
\brief Àâòîìàòè÷åñêèé ðàñ÷åò ñìåùåíèÿ äëÿ ÀÖÏ
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
|
||||
|
||||
|
||||
Äàííîå ïðîãðàììíîå îáåñïå÷åíèå ðàñïðîñòðàíÿåòñÿ "êàê åñòü", è Âû,
|
||||
åãî ïîëüçîâàòåëü, ïðèíèìàåòå íà ñåáÿ âñå ðèñêè, ñâÿçàííûå ñ åãî èñïîëüçîâàíèåì.
|
||||
ÎÎÎ "ÍÏÔ Âåêòîð" íå íåñåò íèêàêîé îòâåòñòâåííîñòè çà âîçìîæíûå óáûòêè,
|
||||
ñâÿçàííûå ñ åãî èñïîëüçîâàíèåì.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef V_AUTO_OFFSET_H
|
||||
#define V_AUTO_OFFSET_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include "DSP.h"
|
||||
|
||||
struct SAutoOffset
|
||||
{
|
||||
_iq FilterK;//!< Êîýôôèöèåíò ôèëüòðà (òåìï èçìåíåíèÿ ñìåùåíèÿ)
|
||||
int32 IA_int; //!< Èíòåãðàòîð äëÿ òîêà ôàçû A
|
||||
int32 IB_int; //!< Èíòåãðàòîð äëÿ òîêà ôàçû B
|
||||
int32 IC_int; //!< Èíòåãðàòîð äëÿ òîêà ôàçû C
|
||||
int Enabled; //!< Âêëþ÷åíî/âûêëþ÷åíî
|
||||
void (*init)(volatile struct SAutoOffset *);
|
||||
void (*ms_calc)(volatile struct SAutoOffset *);
|
||||
void (*slow_calc)(volatile struct SAutoOffset *);
|
||||
};
|
||||
|
||||
typedef volatile struct SAutoOffset TAutoOffset;
|
||||
|
||||
|
||||
#define AUTO_OFFSET_DEFAULTS {\
|
||||
_IQ(0.0001),\
|
||||
0,0,0,\
|
||||
0,\
|
||||
AutoOffset_init,\
|
||||
AutoOffset_calc,\
|
||||
AutoOffset_slow_calc}
|
||||
|
||||
void AutoOffset_init(TAutoOffset *);
|
||||
void AutoOffset_calc(TAutoOffset *);
|
||||
void AutoOffset_slow_calc(TAutoOffset *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
110
Vinclude/V_CANtoRS.h
Normal file
110
Vinclude/V_CANtoRS.h
Normal file
@ -0,0 +1,110 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file v_CANtoRS.h
|
||||
\brief Ïðåîáðàçîâàòåëü ïîñûëîê CAN â RS/USB è îáðàòíî. Ðàáîòàåò
|
||||
ñîâìåñòíî ñ äðàéâåðîì CANOpen
|
||||
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 3.0 08/08/2017
|
||||
|
||||
*/
|
||||
|
||||
#ifndef V_CAN_TO_RS_H
|
||||
#define V_CAN_TO_RS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CANTORS_BUFSIZE 20
|
||||
#define CANTORS_TRANSM_TIME_OUT 10
|
||||
#define CANTORS_READ_DATA_MAX_LEN 10
|
||||
#define CANTORS_HEART_COUNTER_MAX 1000
|
||||
|
||||
|
||||
#define CANTORS_ACTIVE 0x1
|
||||
#define CANTOUSB_ACTIVE 0x2
|
||||
|
||||
#include "DSP.h"
|
||||
#include "CANOpen_drv.h"
|
||||
|
||||
struct SCANtoRS {
|
||||
Uint16 lastActiveConnection; // Îïðåäåëÿåò, êàêîé èíòåðôåéñ áûë àêòèâåí â ïîñëåäíèé ðàç - USB èëè RS
|
||||
Uint8 tempBuf[13]; // Âðåìåííûé áóôåð äëÿ äàííûõ
|
||||
Uint16 test_dbg; //äëÿ îòëàäêè
|
||||
Uint16 APIpacketMode;
|
||||
int16 HeartBeatGo;//ïðîïóñòèòå ñåðäöåáèåíèå!
|
||||
Uint16 callback_go; //ôëàã äëÿ âûçîâà callback
|
||||
Uint16 TransmBusy; //ôëàã çàíÿòîñòè ïåðåäàò÷èêà
|
||||
Uint16 PacketInWait; //ôëàã åñëè åñòü ÷òî-òî â áóôåðå îòïðàâêè
|
||||
Uint16 HeartCounter; //ñ÷åò÷èê äëÿ îòïðàâêè HeartBeat
|
||||
Uint16 TransmBusyTimeCount; //ñ÷åò÷èê òàéìàóòà çàíÿòîñòè ïåðåäàò÷èêà
|
||||
Uint16 ReadPackDataCounter; //ñ÷åò÷èê äàííûõ â ïàêåòå
|
||||
Uint16 ReadCRCCounter; //ñ÷åò÷èê äàííûõ â ïàêåòå
|
||||
Uint16 SendTimeoutCounter;
|
||||
Uint16 all_len; //transmit buf len
|
||||
Uint16 tr_counter; //transmit counter
|
||||
Uint16 MessDrop1;
|
||||
Uint16 MessDrop2;
|
||||
Uint16 MessDrop3;
|
||||
Uint16 CounterWrongCRC;
|
||||
Uint16 CounterRes;
|
||||
Uint16 CounterSended;
|
||||
void (*init)(volatile struct SCANtoRS *); /* Pointer to the init function */
|
||||
void (*calc)(volatile struct SCANtoRS *); /* Pointer to the calc function */
|
||||
void (*receive)(volatile struct SCANtoRS *);
|
||||
Uint16 (*write)(TZCanMsg* MSG,volatile struct SCANtoRS *);
|
||||
void (*callback)(TCo_OdVars* ppc, TZCanMsg* p);
|
||||
unsigned char buf_out[CANTORS_BUFSIZE];
|
||||
Uint16 temp_buf[CANTORS_BUFSIZE];
|
||||
TZCanMsg MSG;
|
||||
TZCanMsg bufMSG;
|
||||
Uint16 ReadPackData[CANTORS_BUFSIZE]; //áóôåð äëÿ API ïîñûëêè
|
||||
Uint16 ReadCRC[2]; //áóôåð äëÿ ÑRC
|
||||
Uint16 TempData[10];
|
||||
Uint16* nodeID;
|
||||
UART_TypeDef *UART;//!Óêàçàòåëü íà èñïîëüçóåìûé ìîäóëü UART
|
||||
};
|
||||
|
||||
typedef volatile struct SCANtoRS TCANtoRS;
|
||||
|
||||
|
||||
void CANtoRS_init(TCANtoRS*);
|
||||
void CANtoRS_calc(TCANtoRS*);
|
||||
void CANtoRS_Receive(TCANtoRS*);
|
||||
Uint16 CANtoRS_SendP(Uint16* Data, int16 len,TCANtoRS *p);
|
||||
Uint16 CANtoRS_Write(TZCanMsg* MSG,TCANtoRS *p);
|
||||
Uint16 CANtoRS_WriteHelper(TZCanMsg* MSG,TCANtoRS *p);
|
||||
void CANtoRS_HeartBeat(TCANtoRS *p);
|
||||
Uint16 CANtoRS_C_CRC(TCANtoRS *p,Uint16 *Data,Uint16 len);
|
||||
void CANtoRS_Analysis(TCANtoRS*);
|
||||
|
||||
|
||||
//åñëè äîáàâëÿåì â ñòðóêóðó ïåðåìåííûå òî äîáàâëÿåì çíà÷åíèÿ ïî óìîë÷àíèþ
|
||||
#define CAN_TO_RS_DEFAULTS { .init = CANtoRS_init,\
|
||||
.calc = CANtoRS_calc,\
|
||||
.receive = CANtoRS_Receive,\
|
||||
.write = CANtoRS_WriteHelper}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
101
Vinclude/V_CurPar.h
Normal file
101
Vinclude/V_CurPar.h
Normal file
@ -0,0 +1,101 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_CurPar.h
|
||||
\brief Ðàñ÷åò íàáëþäàåìûõ òåêóùèõ ïàðàìåòðîâ (ñì. TCurPar)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_CurPar Ðàñ÷åò íàáëþäàåìûõ òåêóùèõ ïàðàìåòðîâ (ñì. TCurPar)
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
#ifndef V_CURPAR_H
|
||||
#define V_CURPAR_H
|
||||
|
||||
#include "filter.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*! \class TCurPar
|
||||
\brief Ðàñ÷åò íàáëþäàåìûõ òåêóùèõ ïàðàìåòðîâ
|
||||
|
||||
Êëàññ \a TCurPar, îñíîâàííûé íà ñòðóêòóðå SCurPar, ñîäåðæèò
|
||||
ðÿä ðàçðîçíåííûõ âû÷èñëåíèé äëÿ îòîáðàæåíèÿ òåêóùèõ ïàðàìåòðîâ ïðèâîäà.
|
||||
Íàïðèìåð, ðàñ÷åò äåéñòâóþùèõ òîêîâ ôàç, òåêóùåé ìîùíîñòè è ò.ï.
|
||||
*/
|
||||
|
||||
//! ñì. TCurPar
|
||||
struct SCurPar{
|
||||
long speed; //!< Òåêóùàÿ ÷àñòîòà âðàùåíèÿ
|
||||
long power; //!< Òåêóùàÿ ìîùíîñòü
|
||||
long Is; //!< Òåêóùàÿ òîê ñòàòîðà àìïëèòóäíûé ìãíîâåííûé
|
||||
long ThetaRefCurr; //!< Çàäàííîå óãëîâîå ïîëîæåíèå
|
||||
long ThetaCurr; //!< Òåêóùåå óãëîâîå ïîëîæåíèå
|
||||
|
||||
long IsRef; //!< Òîê ñòàòîðà çàäàííûé
|
||||
long Ialpha; //!< Òîê ïî îñè àëüôà
|
||||
long Ibeta; //!< Òîê ïî îñè áåòòà
|
||||
|
||||
long Ualpha; //!< Íàïðÿæåíèå ïî îñè àëüôà
|
||||
long Ubeta; //!< Íàïðÿæåíèå ïî îñè áåòòà
|
||||
long PowerK; //!< Ñëóæåáíûé ïàðàìåòð äëÿ ìàñøòàáèðîâàíèÿ ìîùíîñòè
|
||||
|
||||
TFilter fPower; //!< Ôèëüòð ìîùíîñòè
|
||||
|
||||
void (*init)(volatile struct SCurPar*);//!< ïðîöåäóðà èíèöèàëèçàöèè
|
||||
void (*calc)(volatile struct SCurPar*);//!<ðàñ÷åò
|
||||
void (*slow_calc)(volatile struct SCurPar*);//!<ìåäëåííûé ðàñ÷åò
|
||||
};
|
||||
|
||||
typedef volatile struct SCurPar TCurPar;
|
||||
|
||||
|
||||
//!èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define TCUR_PAR_DEFAULTS \
|
||||
{\
|
||||
0,0,0,0,0,\
|
||||
0,0,0,\
|
||||
0,0,0,\
|
||||
FILTER_DEFAULTS,\
|
||||
&CurPar_init, \
|
||||
&CurPar_calc, \
|
||||
&CurPar_slow_calc, \
|
||||
}
|
||||
|
||||
|
||||
//! \memberof TCurPar
|
||||
void CurPar_init(TCurPar*);
|
||||
//! \memberof TCurPar
|
||||
void CurPar_calc(TCurPar*);
|
||||
//! \memberof TCurPar
|
||||
void CurPar_slow_calc(TCurPar*);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // extern "C"
|
||||
|
||||
#endif // V_UF_H
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
226
Vinclude/V_DPR_eCAP.h
Normal file
226
Vinclude/V_DPR_eCAP.h
Normal file
@ -0,0 +1,226 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_DPR_eCAP.h
|
||||
\brief Модуль расчёта скорости и положения по трём датчикам на элементах Холла.
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
#ifndef V_DPR_ECAP_H
|
||||
#define V_DPR_ECAP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
struct SDPReCAPFLG1_BITS // bits
|
||||
{
|
||||
Uint16 AngleMode:
|
||||
1; // 0 Режим расчета угла: 0 - 6 секторов, 1 - интерполяция
|
||||
Uint16 SpeedMode:
|
||||
1; // 1 Режим расчета скорости: 0 - по каждому датчику, 1 - по каждой метке
|
||||
Uint16 Dir:
|
||||
1; // 2 Направление движения: 0 - по часовой, 1 - против.
|
||||
Uint16 PrevDir:
|
||||
1; // 3 Направление движения: 0 - по часовой, 1 - против.
|
||||
Uint16 CAPnumber:
|
||||
2; // 4-5 Номер eCAP, по которому было предыдущее прерывание.
|
||||
Uint16 ZeroFLG:
|
||||
1; // 6 Флаг обнуления скорости
|
||||
Uint16 SpeedMinFLG:
|
||||
1; // 7
|
||||
|
||||
Uint16 firstlaunch1:1; //!< 1 FLAG: первое попадание в прерывание eCAP1.
|
||||
Uint16 firstlaunch2:1; //!< 2 FLAG: первое попадание в прерывание eCAP2.
|
||||
Uint16 firstlaunch3:1; //!< 3 FLAG: первое попадание в прерывание eCAP3.
|
||||
Uint16 rsvd:
|
||||
5; // 8-15 reserved;
|
||||
};
|
||||
|
||||
union SDPReCAP_FLG1
|
||||
{
|
||||
Uint16 all;
|
||||
struct SDPReCAPFLG1_BITS bit;
|
||||
};
|
||||
|
||||
struct SDPReCAP
|
||||
{
|
||||
int16 enabled;
|
||||
int16 initialized;
|
||||
int16 HallCode; //Текущий код положения по датчикам Холла
|
||||
Uint32 Ts; // Период для расчёта интерполированного угла
|
||||
Uint32 Tspeed; // Период для расчёт скорости
|
||||
Uint32 TsNom; // Период, соответсвующий номинальной скорости
|
||||
Uint32 TsNomMilsec; // Период, соответсвующий номинальной скорости при тактировании 1 мс
|
||||
Uint32 PrevTs; // Предыдущая величина периода для расчёта угла.
|
||||
_iq speed; // Расчитанная скорость
|
||||
|
||||
_iq speedMIN; // Уставка минимальной скорости
|
||||
_iq speedMinREF; // Скорость, соответствующая уставке для обнуления скорости
|
||||
_iq Angle; // Расчитанный интерполированный угол
|
||||
_iq Angle6; // Расчитанный декодированный угол
|
||||
_iq AnglePrev; // Расчитанный декодированный угол предыдущий
|
||||
|
||||
Uint32 cnt; // Счётчик числа прерываний с момента пуска (дальше 2 не считает).
|
||||
Uint32 cnt2; // Счётчик прерываний смомента реверса.
|
||||
Uint32 milsec; // Время в мс с момента прихода прошлой метки
|
||||
Uint32 milsecFIX; // Переститанная уставка для обнуления скорости
|
||||
Uint32 milsecREF; // Уставка для обнуления скорости
|
||||
Uint32 milsecPrevREF; // Предыдущее значение уставки для обнуления скорости
|
||||
|
||||
Uint32 PrevTspeed; // Предыдущая величина периода для расчёта скорости
|
||||
Uint32 PrevTspeed1; // Предыдущая величина периода для расчёта скорости по датчику А.
|
||||
Uint32 PrevTspeed11;
|
||||
Uint32 PrevTspeed2; // Предыдущая величина периода для расчёта скорости по датчику B.
|
||||
Uint32 PrevTspeed22;
|
||||
Uint32 PrevTspeed3; // Предыдущая величина периода для расчёта скорости по датчику C.
|
||||
Uint32 PrevTspeed33;
|
||||
|
||||
int16 CAPCalcEna1;
|
||||
int16 CAPCalcEna2;
|
||||
int16 CAPCalcEna3;
|
||||
|
||||
int16 CAP_WrongEdgeCnt;
|
||||
int16 CAP_WrongEdgeCnt1;
|
||||
int16 CAP_WrongEdgeCnt2;
|
||||
int16 CAP_WrongEdgeCnt3;
|
||||
int16 CAP_WrongEdgeCntPrev;
|
||||
|
||||
Uint16 WrongCodeCounter;
|
||||
Uint16 WrongCodeCounterPerSec;
|
||||
Uint16 WrongCodeCounterLimitPerSec;
|
||||
int32 AngleOffset;
|
||||
|
||||
|
||||
int16 ErrorLevel;
|
||||
int16 ErrorLevelCounter;
|
||||
int16 ErrorLevelTimeCounterBig;
|
||||
int16 ErrorLevelTimeCounter;
|
||||
int16 SensorFault;
|
||||
Uint16 UserDirection;//пользовательская инверсия направления
|
||||
|
||||
float SimulatorOmega2IQ_factor;
|
||||
|
||||
union SDPReCAP_FLG1 DPReCAP_FLG1;
|
||||
|
||||
void (*Init)(volatile struct SDPReCAP*);
|
||||
void (*AngleCalc)(volatile struct SDPReCAP*);
|
||||
void (*Angle6Calc)(volatile struct SDPReCAP*);
|
||||
void (*AngleErrorCalc)(volatile struct SDPReCAP*);
|
||||
void (*SpeedCalc)(volatile struct SDPReCAP*);
|
||||
void (*CAP1Calc)(volatile struct SDPReCAP*);
|
||||
void (*CAP2Calc)(volatile struct SDPReCAP*);
|
||||
void (*CAP3Calc)(volatile struct SDPReCAP*);
|
||||
void (*HelpCalc)(volatile struct SDPReCAP*);
|
||||
void (*slow_calc)(volatile struct SDPReCAP*);
|
||||
void (*ms_calc)(volatile struct SDPReCAP*);
|
||||
void (*calc_10k)(volatile struct SDPReCAP*);
|
||||
};
|
||||
typedef volatile struct SDPReCAP TDPReCAP;
|
||||
|
||||
/******************************************************************************
|
||||
Инициализация структуры по умолчанию
|
||||
******************************************************************************/
|
||||
#define DPRECAP_DEFAULTS \
|
||||
{\
|
||||
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,\
|
||||
&DPReCAP_Init, \
|
||||
&DPReCAP_AngleCalc, \
|
||||
&DPReCAP_Angle6Calc, \
|
||||
&DPReCAP_AngleErrorCalc, \
|
||||
&DPReCAP_SpeedCalc, \
|
||||
&DPReCAP_CAP1Calc, \
|
||||
&DPReCAP_CAP2Calc, \
|
||||
&DPReCAP_CAP3Calc, \
|
||||
&DPReCAP_HelpCalc, \
|
||||
&DPReCAP_SlowCalc, \
|
||||
&DPReCAP_msCalc, \
|
||||
&DPReCAP_calc_10k\
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
Процедура инициализации.
|
||||
******************************************************************************/
|
||||
void DPReCAP_Init(TDPReCAP*);
|
||||
|
||||
/******************************************************************************
|
||||
Процедура расчёта угла.
|
||||
******************************************************************************/
|
||||
void DPReCAP_Angle6Calc(TDPReCAP*);
|
||||
|
||||
/******************************************************************************
|
||||
Процедура вычисления факта ошибочного изменения угла.
|
||||
******************************************************************************/
|
||||
void DPReCAP_AngleErrorCalc(TDPReCAP*);
|
||||
|
||||
/******************************************************************************
|
||||
Процедура расчёта интерполированного угла.
|
||||
******************************************************************************/
|
||||
void DPReCAP_AngleCalc(TDPReCAP*);
|
||||
|
||||
/******************************************************************************
|
||||
Процедура расчёта скорости.
|
||||
******************************************************************************/
|
||||
void DPReCAP_SpeedCalc(TDPReCAP*);
|
||||
|
||||
/******************************************************************************
|
||||
Расчёт прерывания 1
|
||||
******************************************************************************/
|
||||
void DPReCAP_CAP1Calc(TDPReCAP*);
|
||||
|
||||
/******************************************************************************
|
||||
Расчёт прерывания 2
|
||||
******************************************************************************/
|
||||
void DPReCAP_CAP2Calc(TDPReCAP*);
|
||||
|
||||
/******************************************************************************
|
||||
Расчёт прерывания 3
|
||||
******************************************************************************/
|
||||
void DPReCAP_CAP3Calc(TDPReCAP*);
|
||||
|
||||
/******************************************************************************
|
||||
Вспомогательные расчёт, общий для всех прерываний
|
||||
******************************************************************************/
|
||||
void DPReCAP_HelpCalc(TDPReCAP*);
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Вспомогательные расчёт в фоне
|
||||
******************************************************************************/
|
||||
void DPReCAP_SlowCalc(TDPReCAP*);
|
||||
|
||||
/******************************************************************************
|
||||
Миллисекундный расчет
|
||||
******************************************************************************/
|
||||
void DPReCAP_msCalc(TDPReCAP*);
|
||||
|
||||
|
||||
void DPReCAP_calc_10k(TDPReCAP* p);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif // extern "C"
|
||||
|
||||
#endif // V_DPR_ECAP_H
|
337
Vinclude/V_IQmath.h
Normal file
337
Vinclude/V_IQmath.h
Normal file
@ -0,0 +1,337 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_IQmath.h
|
||||
\brief Áèáëèîòåêà ôóíêöèé öåëî÷èñëåííîé ìàòåìàòèêè
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". Âñå ïðàâà çàùèùåíû. http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_IQmath Áèáëèîòåêà ôóíêöèé öåëî÷èñëåííîé ìàòåìàòèêè
|
||||
|
||||
\addtogroup V_IQmath
|
||||
@{*/
|
||||
|
||||
|
||||
#ifndef V_IQ_MATH_H
|
||||
#define V_IQ_MATH_H
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "DSP.h"
|
||||
|
||||
|
||||
static const int32 fix16_max = 0x7FFFFFFF; /*!< the maximum value of int32 */
|
||||
static const int32 fix16_min = 0x80000000; /*!< the minimum value of int32 */
|
||||
static const int32 fix16_overflow = 0x80000000; /*!< the value used to indicate overflows when FIXMATH_NO_OVERFLOW is not specified */
|
||||
|
||||
|
||||
static const int32 fix16_pi = 205887;
|
||||
static const int32 fix16_e = 178145;
|
||||
static const int32 fix16_one = 0x00010000;
|
||||
#define _PI 3.1415926535f
|
||||
typedef int32 _iq;
|
||||
|
||||
|
||||
//Ïðåîáðàçîâàíèå äàííûõ â ôîðìàòå ñ ïëàâàþùåé òî÷êîé â öåëî÷èñëåííûå ôîðìàòû îò IQ1 äî IQ30.
|
||||
#define _IQ30(A) (long) ((A) * 1073741824.0f)
|
||||
#define _IQ29(A) (long) ((A) * 536870912.0f)
|
||||
#define _IQ28(A) (long) ((A) * 268435456.0f)
|
||||
#define _IQ27(A) (long) ((A) * 134217728.0f)
|
||||
#define _IQ26(A) (long) ((A) * 67108864.0f)
|
||||
#define _IQ25(A) (long) ((A) * 33554432.0f)
|
||||
#define _IQ24(A) (long) ((A) * 16777216.0f)
|
||||
#define _IQ23(A) (long) ((A) * 8388608.0f)
|
||||
#define _IQ22(A) (long) ((A) * 4194304.0f)
|
||||
#define _IQ21(A) (long) ((A) * 2097152.0f)
|
||||
#define _IQ20(A) (long) ((A) * 1048576.0f)
|
||||
#define _IQ19(A) (long) ((A) * 524288.0f)
|
||||
#define _IQ18(A) (long) ((A) * 262144.0f)
|
||||
#define _IQ17(A) (long) ((A) * 131072.0f)
|
||||
#define _IQ16(A) (long) ((A) * 65536.0f)
|
||||
#define _IQ15(A) (long) ((A) * 32768.0f)
|
||||
#define _IQ14(A) (long) ((A) * 16384.0f)
|
||||
#define _IQ13(A) (long) ((A) * 8192.0f)
|
||||
#define _IQ12(A) (long) ((A) * 4096.0f)
|
||||
#define _IQ11(A) (long) ((A) * 2048.0f)
|
||||
#define _IQ10(A) (long) ((A) * 1024.0f)
|
||||
#define _IQ9(A) (long) ((A) * 512.0f)
|
||||
#define _IQ8(A) (long) ((A) * 256.0f)
|
||||
#define _IQ7(A) (long) ((A) * 128.0f)
|
||||
#define _IQ6(A) (long) ((A) * 64.0f)
|
||||
#define _IQ5(A) (long) ((A) * 32.0f)
|
||||
#define _IQ4(A) (long) ((A) * 16.0f)
|
||||
#define _IQ3(A) (long) ((A) * 8.0f)
|
||||
#define _IQ2(A) (long) ((A) * 4.0f)
|
||||
#define _IQ1(A) (long) ((A) * 2.0f)
|
||||
|
||||
//ïî óìîë÷àíèþ ôîðìàò IQ24
|
||||
#define _IQ(A) _IQ24(A)
|
||||
#define _IQmpy(A,B) _IQ24mpy(A,B)
|
||||
#define _IQmpyI32(A,B) _IQ24mpyI32(A,B)
|
||||
#define _IQdiv(A,B) _IQ24div(A,B)
|
||||
#define _IQsqrt(A) _IQ24sqrt(A)
|
||||
#define _IQsinPU(A) _IQ24sinPU(A)
|
||||
#define _IQcosPU(A) _IQ24cosPU(A)
|
||||
#define _IQsin(A) _IQ24sin(A)
|
||||
#define _IQcos(A) _IQ24cos(A)
|
||||
#define _IQtanPU(A) _IQ24tanPU(A)
|
||||
#define _IQatan2PU(A,B) _IQ24atan2PU(A,B)
|
||||
#define _IQmag(A,B) _IQ24mag(A,B)
|
||||
#define _IQtoF(A) _IQ24toF(A)
|
||||
|
||||
|
||||
int32 _IQ24sinPU(int32 inAngle);
|
||||
int32 _IQ24atan2PU(int32 inY , int32 inX);
|
||||
int32 _IQ24sinPU_accurate(int32 inAngle);
|
||||
int32 _IQ24sqrt(int32 inValue);
|
||||
int32 _IQ16div(int32 a, int32 b);
|
||||
int32 _IQ24div(int32 a, int32 b);
|
||||
int32 _IQ21div(int32 a, int32 b);
|
||||
int32 _IQ10div(int32 a, int32 b);
|
||||
int32 _IQ24mag(int32 a, int32 b);
|
||||
|
||||
//! Ïðåîáðàçóåò èç öåëî÷èñëåííîãî 8.24 â ôîðìàò float
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline float _IQ24toF(int32_t a) {
|
||||
return (float)(a)*(1.0/16777216.0f);
|
||||
}
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline float _IQ21toF(int32_t a) {
|
||||
return (float)(a)*(1.0/2097152.0f);
|
||||
}
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline float _IQ12toF(int32_t a) {
|
||||
return (float)(a)*(1.0/4096.0f);
|
||||
}
|
||||
|
||||
//! Ïðåîáðàçóåò èç öåëî÷èñëåííîãî 22.10 â ôîðìàò float
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline float _IQ10toF(int32_t a) {
|
||||
return (float)(a)*(1.0/1024.0f);
|
||||
}
|
||||
|
||||
//! Ïðåîáðàçóåò èç öåëî÷èñëåííîãî 26.6 â ôîðìàò float
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline float _IQ6toF(int32_t a) {
|
||||
return (float)(a)*(1.0/64.0f);
|
||||
}
|
||||
|
||||
//! Óìíîæåíèå äâóõ ÷èñåë â ôîðìàòå 8.24
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ24mpy(int32 inArg0, int32 inArg1) {
|
||||
return (int32)(((int64_t)inArg0 * inArg1)>> 24);
|
||||
}
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ18mpy(int32 inArg0, int32 inArg1) {
|
||||
return (int32)(((int64_t)inArg0 * inArg1)>> 18);
|
||||
}
|
||||
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ20mpy(int32 inArg0, int32 inArg1) {
|
||||
return (int32)(((int64_t)inArg0 * inArg1)>> 20);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! Óìíîæåíèå äâóõ ÷èñåë â ôîðìàòå 32.0
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ24mpyI32(int32 inArg0, int32 inArg1) {
|
||||
return (inArg0 * inArg1);
|
||||
}
|
||||
|
||||
//! Óìíîæåíèå äâóõ ÷èñåë â ôîðìàòå 16.16
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ16mpy(int32 inArg0, int32 inArg1) {
|
||||
int64_t product = (int64_t)inArg0 * inArg1;
|
||||
int32 result = product >> 16;
|
||||
// result += (product & 0x8000) >> 15; //Íåïîíòÿíî äëÿ ÷åãî. Íàïèñàíî äëÿ îêðóãëåíèÿ
|
||||
return result;
|
||||
}
|
||||
|
||||
//! Óìíîæåíèå äâóõ ÷èñåë â ôîðìàòå 28.4
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ4mpy(int32 inArg0, int32 inArg1) {
|
||||
return (int32)(((int64_t)inArg0 * inArg1)>> 4);
|
||||
}
|
||||
|
||||
|
||||
//! Ôóíêöèÿ êîñèíóñà, âûçûâàåò ôóíêöèþ ñèíóñà
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ24cosPU(int32 inAngle) {
|
||||
return _IQ24sinPU(inAngle + _IQ24(0.25));
|
||||
}
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ18sinPU(int32 inAngle) {
|
||||
return _IQ24sinPU(inAngle<<6)>>6;
|
||||
}
|
||||
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ18cosPU(int32 inAngle) {
|
||||
return _IQ24sinPU((inAngle<<6) + _IQ24(0.25))>>6;
|
||||
}
|
||||
|
||||
|
||||
//! Ôóíêöèÿ òàíãåíñà, âûçûâàåò ôóíêöèè ñèíóñà è êîñèíóñà.
|
||||
|
||||
//! \memberof V_IQmath
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ24tanPU(int32 inAngle) {
|
||||
return _IQ24div(_IQ24sinPU(inAngle), _IQ24sinPU(inAngle));
|
||||
}
|
||||
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ16toIQ(int32 a){
|
||||
return (a << 8);
|
||||
}
|
||||
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ24cos(int32 x){
|
||||
x = _IQmpy(x, _IQ(0.15915494309189533576));
|
||||
return _IQsinPU(x + _IQ24(0.25));
|
||||
}
|
||||
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQ24sin(int32 x){
|
||||
x = _IQmpy(x, _IQ(0.15915494309189533576));
|
||||
return _IQsinPU(x);
|
||||
}
|
||||
|
||||
#if defined (__GNUC__)
|
||||
__attribute__((always_inline))
|
||||
#elif defined (__CMCPPARM__)
|
||||
__STATIC_INLINE
|
||||
#endif
|
||||
inline int32 _IQabs(int32 x){
|
||||
if (x<0)
|
||||
return -x;
|
||||
return x;
|
||||
}
|
||||
|
||||
#ifdef __CMCPPARM__
|
||||
#define fabs(x) fabsf(x)
|
||||
#endif /* __CMCPPARM__ */
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
90
Vinclude/V_MBVarsConv.h
Normal file
90
Vinclude/V_MBVarsConv.h
Normal file
@ -0,0 +1,90 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file v_MBVarsConv.h
|
||||
\brief Ìîäóëü ïðåîáðàçîâàíèÿ äàííûõ Modbus
|
||||
\author ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
\version v.1.1. 02/03/2017
|
||||
|
||||
\addtogroup v_ModBus
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef V_MBVARSCONV_H
|
||||
#define V_MBVARSCONV_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "DSP.h"
|
||||
|
||||
/*! \class TMBVarsConv
|
||||
\brief Ìîäóëü ïðåîáðàçîâàíèÿ äàííûõ Modbus
|
||||
|
||||
Êëàññ \a TMBVarsConv, îñíîâàííûé íà ñòðóêòóðå SMBVarsConv, ïðåäíàçíà÷åí
|
||||
äëÿ ïðåîáðàçîâàíèÿ äàííûõ èç ôîðìàòà 16 ðàçðÿäîâ Modbus â ôîðìàò ñèñòåìû óïðàâëåíèÿ (IQ 24).
|
||||
*/
|
||||
|
||||
|
||||
struct SMBVars{
|
||||
int Command;
|
||||
int CommandPrev;
|
||||
int speed_ref;
|
||||
int CurIs;
|
||||
int CurSpeed;
|
||||
int Main_ErrorCode;
|
||||
int Umax_protect;
|
||||
};
|
||||
//!ñì. TMBVarsConv MBVars
|
||||
#define SMBVARS_DEFAULTS {0,0,0,0,0,0}
|
||||
|
||||
|
||||
struct SMBVarsConv{
|
||||
struct SMBVars Vars;
|
||||
Uint16 NeedForSave;
|
||||
void (*init)(volatile struct SMBVarsConv*);
|
||||
void (*calc)(volatile struct SMBVarsConv*);
|
||||
void (*slow_calc)(volatile struct SMBVarsConv*);
|
||||
};
|
||||
|
||||
typedef volatile struct SMBVarsConv TMBVarsConv;
|
||||
|
||||
//!Èíèöèàëèçàòîð ïî óìîë÷àíèþ
|
||||
#define MBVARSCONV_DEFAULTS { SMBVARS_DEFAULTS,\
|
||||
0,\
|
||||
MBVarsConv_init,\
|
||||
MBVarsConv_calc,\
|
||||
MBVarsConv_slow_calc\
|
||||
}
|
||||
|
||||
//! \memberof TMBVarsConv
|
||||
void MBVarsConv_init(TMBVarsConv *p);
|
||||
//! \memberof TMBVarsConv
|
||||
void MBVarsConv_calc(TMBVarsConv *p);
|
||||
//! \memberof TMBVarsConv
|
||||
void MBVarsConv_slow_calc(TMBVarsConv *p);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
126
Vinclude/V_ModBus.h
Normal file
126
Vinclude/V_ModBus.h
Normal file
@ -0,0 +1,126 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_ModBus.h
|
||||
\brief Äðàéâåð ModBus (ñì. TModBus)
|
||||
\author Alecksey Anuchin
|
||||
\version v 1.1 24/03/2017
|
||||
\defgroup V_ModBus Äðàéâåð ModBus (ñì. TModBus)
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef V_MODBUS_H
|
||||
#define V_MODBUS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "mbod.h"
|
||||
|
||||
|
||||
#define MODBUS_MAX_RX_COUNT 10
|
||||
|
||||
/*! \class TModBus
|
||||
\brief Äðàéâåð ModBus
|
||||
|
||||
Êëàññ \a TModBus, îñíîâàííûé íà ñòðóêòóðå SModBus, îáðàáàòûâàåò
|
||||
âõîäÿùèå ïîñûëêè ïî RS-485 êàê ïîñûëêè ModBus (RTU). */
|
||||
|
||||
//! ñì. TModBus
|
||||
|
||||
|
||||
//! Ñòðóêòóðà modbus äëÿ õðàíåíèÿ âíóòðåííèõ äàííûõ
|
||||
typedef struct {volatile Uint16 In[MODBUS_MAX_RX_COUNT];//!<Ìàññèâ äëÿ ïðèíÿòèÿ äàííûõ
|
||||
volatile Uint16 InCount;//!<Ñ÷åò÷èê äëÿ ìàññèâà ïðèíÿòûõ äàííûõ
|
||||
volatile MB_Record /*const*/ *Addr;//!<Óêàçàòåëü íà ñëîâàðü
|
||||
volatile Uint16 TimeOut;//!<Òåêóùèé òàéìàóò, êîòîðûé íàäî âûäåðæèâàòü
|
||||
volatile Uint16 TimeOut1_5;//!<Ðàññ÷èòàííûé òàéìàóò 1,5 äëèíû ïåðåäàííîãî áàéòà
|
||||
volatile Uint16 TimeOut2_5;//!<Ðàññ÷èòàííûé òàéìàóò 2,5 äëèíû ïåðåäàííîãî áàéòà
|
||||
volatile Uint16 ToSend;//!<Äàííûå äëÿ îòïðàâêè
|
||||
volatile Uint16 NumOfHRs;//!<Êîëè÷åñòâî Holding Registers
|
||||
volatile Uint16 MiddleOfHRs;//!<Ñåðåäèíà Holding Registers
|
||||
volatile Uint16 InitialStepOfHRs;//!<Øàã Holding Registers
|
||||
volatile Uint16 NumOfIRs;//!<Êîëè÷åñòâî Input Registers
|
||||
volatile Uint16 MiddleOfIRs;//!<Ñåðåäèíà Input Registers
|
||||
volatile Uint16 InitialStepOfIRs;//!<Øàã Input Registers
|
||||
volatile Uint16 NumOfCs;//!<Êîëè÷åñòâî Coils
|
||||
volatile Uint16 MiddleOfCs;//!<Ñåðåäèíà Coils
|
||||
volatile Uint16 InitialStepOfCs;//!<Øàã Coils
|
||||
volatile Uint16 NumOfDIs;//!<Êîëè÷åñòâî Discrete Inputs
|
||||
volatile Uint16 MiddleOfDIs;//!<Ñåðåäèíà Discrete Inputs
|
||||
volatile Uint16 InitialStepOfDIs;//!<Øàã Discrete Inputs
|
||||
volatile Uint16 RxCRC;//!<Ïðèíèìàåìàÿ êîíòðîëüíàÿ ñóììà
|
||||
volatile Uint16 TxCRC;//!<Ïåðåäàâàåìàÿ êîíòðîëüíàÿ ñóììà
|
||||
volatile Uint16 MagicNumber;//!<Ýì...
|
||||
volatile int16 TxState;//!<Ñîñòîÿíèå ïåðåäà÷è
|
||||
volatile Uint16 temp;//!<
|
||||
volatile int16 RecievedCounter;//!<Ñ÷åò÷èê äëÿ îòñ÷èûâàíèÿ òàéìàóòà ïî ïðèåìó
|
||||
UART_TypeDef *UART;//!Óêàçàòåëü íà èñïîëüçóåìûé ìîäóëü UART
|
||||
} MODBUS_INT;
|
||||
|
||||
#define MODBUS_INT_DEFAULTS {{0},0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
|
||||
0xFFFF,0xFFFF, 0xA001,-1, 0,0, \
|
||||
}
|
||||
|
||||
struct SModBus{Uint32 BaudRate;//!<Ñêîðîñòü ðàáîòû ïî RS
|
||||
Uint16 ExecutionFreq;//!< ×àñòîòà òàêòèðîâàíèÿ ìîäóëÿ
|
||||
Uint16 RSNodeID; //!< Íîìåð óçëà â ñåòè
|
||||
Uint16 Enabled; //!< Ðàçðåøåíèå èçìåíåíèÿ ïàðàìåòðîâ ïðèâîäà ÷åðåç ModBus
|
||||
Uint16 Refresh; //!< Ôëàã èçìåíåíèÿ ïàðàìåòðîâ ïî Modbus
|
||||
int16 error;
|
||||
int16 errorCode;
|
||||
int16 AutoRestart;
|
||||
int16 clear_error;
|
||||
Uint16 received_data;
|
||||
Uint16 GPIOsValue;
|
||||
Uint16 isOnline;//!< Â ñåòè ìû èëè íåò (èäóò ëè ïàêåòû)
|
||||
Uint32 OfflineCounter;//!< Ñ÷åò÷èê èíêðåìåíòèðóåòñÿ ñ ÷àñòîòîé âûçîâà ïðîöåäóðû ModBus_Execute è îáíóëÿåòñÿ, åñëè â ñåòè åñòü ïàêåòû
|
||||
Uint32 OfflineCounterMax;//!< Òàéìàóò îòñóòñòâèÿ ïàêåòîâ â ñåòè (â åäèíèöàõ ñ÷¸òà OfflineCounter)
|
||||
Uint16 ReceiveByteCounter;//!< Ñ÷åò÷èê ïðèíÿòûõ áàéò
|
||||
Uint16 ReceivePacketCounter;//!< Ñ÷åò÷èê ïðèíÿòûõ ïîñûëîê
|
||||
MODBUS_INT MBInternals;//!< Ñëóæåáíûå ïåðåìåííûå äëÿ ðàáîòû äðàéâåðà (íå äëÿ ïîëüçîâàòåëÿ)
|
||||
void (*Init)(volatile struct SModBus*);
|
||||
void (*Execute)(volatile struct SModBus*);
|
||||
};
|
||||
|
||||
|
||||
typedef volatile struct SModBus TModBus;
|
||||
|
||||
|
||||
#define MODBUS_DEFAULTS {9600,10000, 0x01, 1, 0,\
|
||||
0,0,0,0,0,0,0,0,0,0,0,\
|
||||
MODBUS_INT_DEFAULTS,\
|
||||
ModBus_Init, \
|
||||
ModBus_Execute,\
|
||||
}
|
||||
|
||||
|
||||
//! \memberof TModBus
|
||||
void ModBus_Init(TModBus *p);
|
||||
//! \memberof TModBus
|
||||
void ModBus_Execute(TModBus *p);
|
||||
//! \memberof TModBus
|
||||
int16 ModBus_FindVocAddr(TModBus *p,volatile MB_Record Table[], Uint16 TableSize, int16 Type, Uint16 Index, int16 NumOfIndexs, int16 Mid, int16 Step);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
173
Vinclude/V_PWM_Module.h
Normal file
173
Vinclude/V_PWM_Module.h
Normal file
@ -0,0 +1,173 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_PWM_Module.h
|
||||
\brief Модуль реализации векторной ШИМ (см. TPWM_Module)
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_PWM_Module Модуль реализации векторной ШИМ (см. TPWM_Module)
|
||||
@{*/
|
||||
|
||||
#ifndef _V_PWM_Module_
|
||||
#define _V_PWM_Module_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#define _1_SQRT3 _IQ(0.5773503)
|
||||
#define _2_SQRT3 _IQ(1.1547005)
|
||||
|
||||
//! Ограничения частоты ШИМ (кГц) min
|
||||
#define PWM_FREQ_MIN _IQ10(2)
|
||||
//! Ограничения частоты ШИМ (кГц) max
|
||||
#define PWM_FREQ_MAX _IQ10(100.0)
|
||||
|
||||
//!Векторная 6-ти секторная ШИМ
|
||||
#define PWM_TYPE_6SECT_NO_SV 0
|
||||
//!Синусоидальная ШИМ
|
||||
#define PWM_TYPE_SIN_PWM 1
|
||||
//!Векторная 12-ти секторная ШИМ
|
||||
#define PWM_TYPE_12SECT_NO_SV 2
|
||||
//!ШИМ методом вычисления фазных потенциалов
|
||||
#define PWM_TYPE_FLY_12SECT 3
|
||||
//!ШИМ для управления ДПТ
|
||||
#define PWM_TYPE_DC_DRIVE 4
|
||||
//!ШИМ для управления SRM
|
||||
#define PWM_TYPE_SRD 5
|
||||
|
||||
//! Ограничения величины "мёртвого времени", мкс, min
|
||||
#define DEAD_BAND_MIN _IQ(0)
|
||||
//! Ограничения величины "мёртвого времени", мкс, max
|
||||
#define DEAD_BAND_MAX _IQ(10)
|
||||
|
||||
//! Ограничения величины "минимальной скважности", мкс, min
|
||||
#define GAMMA_LIMIT_MIN _IQ(0)
|
||||
//! Ограничения величины "минимальной скважности", мкс, max
|
||||
#define GAMMA_LIMIT_MAX _IQ(10)
|
||||
|
||||
// Константы загрузки регистров AQCTL# и AQCSFRC (ePWM)
|
||||
// (определяют настройку событий для выходов ШИМ)
|
||||
#define AQ_EPWM_DISABLE 0x0000 //!< все события запрещены
|
||||
|
||||
//! Флаг разрешения внутренней привязки ШИМ-выходов
|
||||
#define ENABLE_PULLUP 0
|
||||
|
||||
//!что делать при аппаратной аварии с ножками
|
||||
#define TZ_STATE TZ_HIZ
|
||||
|
||||
/*! \class TPWM_Module
|
||||
\brief Модуль реализации ШИМ
|
||||
|
||||
Класс \a TPWM_Module, основанный на структуре SPWM_Module, реализует
|
||||
векторную и скалярную широтно-импульсную модуляцию для управления
|
||||
шестиключевым инвертором. Имеет настройки мертвого времени,
|
||||
частоты, коррекцию в зависимости от напряжения ЗПТ,
|
||||
компенсацию мертвого времени.
|
||||
Задание напряжения происходит по двум перпендикулярным осям альфа и бетта.
|
||||
При этом ось альфа сонаправлена с осью А трехфазной системы координат. Для задания нового напряжения нужно
|
||||
поместить задание в UalphaRef, UbetaRef и вызвать update. В зависимости от того,
|
||||
какой тип ШИМ выбран в настройках (настраивается пользователем в переменной PWM_type),
|
||||
функция PWM_Module_Update вызовет нужную функцию, реализующую требуемый тип ШИМ.
|
||||
В результате этого на трех фазах инвертора в среднем за период ШИМ будет реализован
|
||||
такой вектор напряжения, который задан в UalphaRef, UbetaRef. Чтобы создать переменное
|
||||
синусоидальное напряжение, требуется вращать вектор задания внешней по отношению к модулю ШИМ программой.
|
||||
*/
|
||||
|
||||
//! см. TPWM_Module
|
||||
struct SPWM_Module {
|
||||
int16 Enabled; //!< Флаг для чтения - включен ШИМ или выключен.
|
||||
int32 UalphaRef; //!<Задание по оси асьфа (задается)
|
||||
int32 UbetaRef; //!<Задание по оси бетта (задается)
|
||||
|
||||
int32 UPhARef; //!<Задание по фазе A (задается)
|
||||
int32 UPhBRef; //!<Задание по фазе B (задается)
|
||||
int32 UPhCRef; //!<Задание по фазе c (задается)
|
||||
|
||||
int32 k_pwm; //!< Период таймера ШИМ, для чтения.
|
||||
int32 U_mag; //!< Текущая амплитуда напряжения, для чтения.
|
||||
int32 U_lim; //!< Ограничение вектора напряжения, задается
|
||||
|
||||
int32 GammaA; //!< Скважность фазы А в размерности таймера ШИМ, для чтения.
|
||||
int32 GammaB; //!< Скважность фазы B в размерности таймера ШИМ, для чтения.
|
||||
int32 GammaC; //!< Скважность фазы C в размерности таймера ШИМ, для чтения.
|
||||
|
||||
int16 PWM_type; //!< Тип ШИМ. Принимает значения констант с префиквом PWM_TYPE_. Задается.
|
||||
int16 PWM_typeOld; //!< Предыдущее значения типа ШИМ, служебная переменная.
|
||||
int16 sector; //!< Текущий сектор в векторном типе ШИМ. Для чтения.
|
||||
|
||||
int32 UalphaNorm; //!< Нормированное задание, служебная переменная.
|
||||
int32 UbetaNorm; //!< Нормированное задание, служебная переменная.
|
||||
int32 UdCorTmp; //!<Служебная переменная для корректировки выходного напряжения в зависимости от напряжения ЗПТ
|
||||
int32 UdCompK; //!< Коэффициент корректировки выходного напряжения инвертора в зависимости от изменения напряжения ЗПТ от номинального. Задается.
|
||||
int32 UdCompEnable; //!< Разрешение корректировки выходного напряжения инвертора в зависимости от изменения напряжения ЗПТ от номинального. Задается.
|
||||
int16 ULimitation; //!< флаг о том, что идет ограничение напряжения - выходное напряжение меньше заданного. Для чтения.
|
||||
_iq Frequency; //!< Частота ШИМ в кГц. Формат 22.10! Задается.
|
||||
_iq FreqPrev; //!< Предудущая частота ШИМ, служебная переменная.
|
||||
int32 DeadBand; //!< величина "мёртвого времени", мкс, задается.
|
||||
int32 MinGammaLimit; //!< минимальная скважность на ключе, задается.
|
||||
int PDP_Fault; //!< Флаг о том, что моудлем ШИМ зафиксирована аппаратная авария от инвертора. Для чтения. По ней необходима реакция модуля защит!
|
||||
int ChargingMode; //!< Режем заряда будстрепных конденсаторов. Должен выставляться в еденицу на время 2-10 мс внешней программой перед запуском ШИМ.
|
||||
void (*init)(volatile struct SPWM_Module*); /* Pointer to the init function */
|
||||
void (*update)(volatile struct SPWM_Module*); /* Pointer to the update function */
|
||||
void (*slow_calc)(volatile struct SPWM_Module*);
|
||||
void (*On)(volatile struct SPWM_Module*); //!< процедура включения (разрешения) ШИМ-выходов
|
||||
void (*Off)(volatile struct SPWM_Module*); //!< процедура отключения (запрещения) ШИМ-выходов
|
||||
};
|
||||
|
||||
typedef volatile struct SPWM_Module TPWM_Module;
|
||||
|
||||
//! Инициализатор по-умолчанию.
|
||||
#define PWM_Module_DEFAULTS {\
|
||||
0,0,0, \
|
||||
0,0,0, \
|
||||
0, \
|
||||
0, \
|
||||
_IQ(0.866),0, \
|
||||
0,0,\
|
||||
0,0,\
|
||||
0,\
|
||||
0,0,0,0,0,0,0x1400,0,0,0,0,0,\
|
||||
PWM_Module_Init, \
|
||||
PWM_Module_Update, \
|
||||
PWM_Module_SlowCalc, \
|
||||
PWM_Module_On, \
|
||||
PWM_Module_Off, \
|
||||
}
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_Init(TPWM_Module *);
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_Update(TPWM_Module *);
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_SlowCalc(TPWM_Module *);
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_On(TPWM_Module *);
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_Off(TPWM_Module *);
|
||||
|
||||
//векторные функции из библиотеки
|
||||
void PWM_Module_No_SV_Update(TPWM_Module *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
251
Vinclude/V_QEP.h
Normal file
251
Vinclude/V_QEP.h
Normal file
@ -0,0 +1,251 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_QEP.h
|
||||
\brief Модуль оценки скорости и положения при помощи eQEP (см. TposspeedEqep)
|
||||
\author ООО "НПФ Вектор". Все права защищены. http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_QEP Модуль оценки скорости и положения при помощи eQEP (см. TposspeedEqep)
|
||||
|
||||
\addtogroup V_QEP
|
||||
@{*/
|
||||
|
||||
|
||||
#include "V_IQmath.h"
|
||||
#include "filter.h"
|
||||
#ifndef V_POSSPEED_EQEP_H
|
||||
#define V_POSSPEED_EQEP_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
struct SPOSSPEEDCTL_BITS { // bits
|
||||
Uint16 InitType:
|
||||
2; // 0:1 INPUT: режим инициализации положения при пуске:
|
||||
// 0 - всё выставляется вручную
|
||||
// 1 - выставляем вектор тока, далее пуск в векторном режиме(исходное положение - 0 электрических градусов);
|
||||
// 2 - пуск в векторном режиме(исходное положение - последнее сохранённое)
|
||||
Uint16 index_en:
|
||||
1; // 2 INPUT: наличие репера
|
||||
// 0 - репер отсутствует
|
||||
// 1 - репер подключён;
|
||||
Uint16 dir:
|
||||
1; // 3 INPUT: направление движения(в случае неправильного направления);
|
||||
// 0 - (по умолчанию)прямое включение;
|
||||
// 1 - инверсия;
|
||||
Uint16 CmdInit:
|
||||
1; // 4 INPUT: для режима инициализации
|
||||
Uint16 Min_clk:
|
||||
4; // 5:8 INPUT: минимальное число меток для захвата на низкой скорости - НЕ МЕНяТЬ!!!!!
|
||||
// Min_clk=2 - 4 метки
|
||||
// 3 - 8 меток - по умолчанию
|
||||
// 4 - 16 меток
|
||||
// 5 - 32 метки
|
||||
// 6 - 64 метки
|
||||
// 7 - 128 меток
|
||||
// 8 - 256 меток
|
||||
// 9 - 512 меток
|
||||
// 10 - 1024 метки
|
||||
Uint16 rsvd:
|
||||
7; // 9:15 reserved;
|
||||
};
|
||||
|
||||
union SPOSSPEED_CTL {
|
||||
Uint16 all;
|
||||
struct SPOSSPEEDCTL_BITS bit;
|
||||
};
|
||||
|
||||
struct SPOSSPEEDFLG1_BITS { // bits
|
||||
Uint16 UTO_tmp:
|
||||
1; // 0 TEMPORARY FLAG: флаг time-out;
|
||||
Uint16 PCO_tmp:
|
||||
1; // 1 TEMPORARY FLAG: флаг положительного переполнения счётчика;
|
||||
Uint16 PCU_tmp:
|
||||
1; // 2 TEMPORARY FLAG: флаг отрицательного переполнения счётчика;
|
||||
Uint16 UPPS_tmp:
|
||||
4; // 3:6 TEMPORARY: значение текущего кванта перемещения для захвата;
|
||||
Uint16 CCPS_tmp:
|
||||
3; // 7:9 TEMPORARY: значение текущего коэффициента деления;
|
||||
Uint16 first_launch:
|
||||
2; // 10:11 FLAG: инициализация первого запуска;
|
||||
Uint16 accuracy:
|
||||
2; // 12:13 FLAG: флаг переключения алгоритмов;
|
||||
Uint16 first_theta:
|
||||
1; // 14 FLAG: флаг первого расчёта углового преращения;
|
||||
Uint16 transit:
|
||||
1; // 15 FLAG: флаг перехода на алгоритм высоких скоростей;
|
||||
|
||||
};
|
||||
|
||||
union SPOSSPEED_FLG1 {
|
||||
Uint16 all;
|
||||
struct SPOSSPEEDFLG1_BITS bit;
|
||||
};
|
||||
|
||||
struct SPOSSPEEDFLG2_BITS { // bits
|
||||
Uint16 pos_ident:
|
||||
1; // 0 FLAG: флаг точной идентификации абсолютного положения ротора;
|
||||
Uint16 UTO_tmp2:
|
||||
1; // 1 TEMPORARY FLAG: флаг time-out;
|
||||
Uint16 PCO_tmp2:
|
||||
1; // 2 TEMPORARY FLAG: флаг положительного переполнения счётчика;
|
||||
Uint16 PCU_tmp2:
|
||||
1; // 3
|
||||
Uint16 lost_UTO:
|
||||
1; // 4
|
||||
Uint16 Dir_prev:
|
||||
1; // 5
|
||||
Uint16 Cdef:
|
||||
1; // 6
|
||||
Uint16 Delay_flux:
|
||||
1; // 7
|
||||
Uint16 first_index:
|
||||
1; // 8
|
||||
Uint16 rsvd:
|
||||
8; // 9:15 reserved;
|
||||
};
|
||||
|
||||
union SPOSSPEED_FLG2 {
|
||||
Uint16 all;
|
||||
struct SPOSSPEEDFLG2_BITS bit;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*! \class TposspeedEqep
|
||||
\brief Модуль обработки квадратурного декодера (ДПР типа "энкодер")
|
||||
|
||||
Класс \a TposspeedEqep, основанный на структуре SposspeedEqep,
|
||||
является модулем для определения углового положения и скорости ротора
|
||||
двигателя по данным от квадратурного энкодера. Для работы с датчиком
|
||||
используется периферийный модуль процессора EQEP. Положение вала theta_elec определяется
|
||||
по аппаратному счетчику QPOSCNT, который увеличивает и уменьшает
|
||||
свое значение автоматически при вращении вала. После включения процессора
|
||||
абсолютное угловое положение вала не может быть оперелено, пока не произойдет
|
||||
событие индексации (сработает реперная метка). Модуль возводит флаг Posspeed_FLG2.bit.pos_ident,
|
||||
как только это происходит. До этого момента значение углового положения не валидное и не должно использоваться
|
||||
системой управления. Для калибровки датчика положения (смещения нулевого положения)
|
||||
используется переменная AngleOffset.
|
||||
Для вычисления скорости speed_elec используется аппаратный счетчик QCPRD,
|
||||
который измеряет время между заданным количеством меток датчика. Для обеспечения приемлемой
|
||||
точности на высоких и низких скоростях "заданное" количество меток переключается на ходу при помощи
|
||||
делителя UPPS. Так как скорость на малых скоростях вращения пульсирует,
|
||||
имеется инерционный фильтр скорости первого порядка, значение которого,
|
||||
speed.output, может быть выведено пользователю.
|
||||
*/
|
||||
|
||||
//! см. TposspeedEqep
|
||||
struct SposspeedEqep {
|
||||
Uint32 resol; //!<INPUT: разрешение датчика в метках/оборот;
|
||||
float resol_inv; //!<обратная величина к разрешению датчика resol
|
||||
Uint16 pole_pairs; //!<INPUT: число пар полюсов;
|
||||
Uint16 SpeedCalcType; //!< Тип расчета скорости вращения: 0 - аппаратно, 1 - программно по углу.
|
||||
float speed_nom; //!<INPUT: номинальная скорость в об/мин;
|
||||
_iq speed_elec; //!<OUTPUT: электрическая скорость в Q24(относительные единицы)
|
||||
_iq theta_elec; //!<OUTPUT: электрический угол в Q24(относительные единицы)
|
||||
float k_low; //!<PARAMETER;
|
||||
Uint32 Poscnt_res; //!<Механическ.угол в метках;
|
||||
Uint16 Poscnt_res16; //!<Механическ.угол в метках 16ти разрядный для осца;
|
||||
Uint32 Poscnt_resPrev; //!<Механическ.угол в метках предыдущее значение;
|
||||
int16 MoveK; //!<TEMPORARY;
|
||||
_iq theta_mech; //!<Механический угол;
|
||||
_iq prevThetaMech; //!<Механический угол предыдущее значение;
|
||||
_iq theta_el_tmp; //!<TEMPORARY: электрический угол;
|
||||
Uint16 speed_calc_skip; //!<пропуск расчета скорости, флаг
|
||||
_iq speedK; //!<TEMPORARY: делитель частоты, тактирующей таймер захвата;
|
||||
union { /*!< Status interrupt */
|
||||
Uint16 Qcprdlat16_tmp; //!<TEMPORARY: копия защёлки времени;
|
||||
Uint32 Qcprdlat_tmp; //!<TEMPORARY: копия защёлки времени;
|
||||
}; //!<Для наблюдения в юниконе
|
||||
union { /*!< Status interrupt */
|
||||
uint16_t QEPSTS; /*!< QEPSTS : type used for word access */
|
||||
_QEP_QEPSTS_bits QEPSTS_bit; /*!< QEPSTS_bit: structure used for bit access */
|
||||
}; //!<Для наблюдения в юниконе
|
||||
Uint16 DirPrev;
|
||||
_iq speed_tmpIQ; //!<TEMPORARY;
|
||||
TFilter speed_filter; //!<Фильтр скорости
|
||||
Uint16 skip_counter;//!< Счетчик пропуска расчета скорости после смены UPPS
|
||||
union SPOSSPEED_CTL Posspeed_CTL;
|
||||
union SPOSSPEED_FLG1 Posspeed_FLG1;
|
||||
union SPOSSPEED_FLG2 Posspeed_FLG2;
|
||||
Uint16 GPIOsValue;//!< Текущее значение ножек GPIO модуля QEP
|
||||
Uint16 Index_eventFlag;
|
||||
Uint16 UPPS_forWatch;//!< Текущее значение UPPS
|
||||
_iq AngleOffset;//!< Смещение электрического угла в градусах
|
||||
int16 RevolutionCounter; // Количество механических оборотов;
|
||||
int16 Poscnt_resContinouosInt8;//!<Механическ.угол в метках c учетом кол-ва оборотов (переменная 8 разрядов отсекается)
|
||||
int16 Poscnt_resContinouosInt;//!<Механическ.угол в метках c учетом кол-ва оборотов (переменная 16 разрядов)
|
||||
long Poscnt_resContinouosLong;//!<Механическ.угол в метках c учетом кол-ва оборотов (переменная 32 разрядов)
|
||||
_iq theta_mechContinouos; //!<Механический угол в градусах абсолютный;
|
||||
_iq theta_elecContinouos; //!<Электрический угол в градусах абсолютный;
|
||||
|
||||
long speed_elec_temp; //Скорость нефильтрованная
|
||||
long theta_start; //внутренняя перременная: Начальный угол
|
||||
long theta_finish;//внутренняя перременная: Конечный угол
|
||||
long d_fi;//внутренняя перременная: разница в угле
|
||||
long KThetaToSpeed; //внутренняя перременная: коэф. пересчета произв. угла в скорость
|
||||
void (*init)(volatile struct SposspeedEqep*);
|
||||
void (*calc)(volatile struct SposspeedEqep*);
|
||||
void (*slow_calc)(volatile struct SposspeedEqep*);
|
||||
void (*index)(volatile struct SposspeedEqep*);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
typedef volatile struct SposspeedEqep TposspeedEqep;
|
||||
|
||||
//! Инициализатор по-умолчанию.
|
||||
#define POSSPEED_DEFAULTS {0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0, 0,{0},{0},0,0,FILTER_DEFAULTS,0,\
|
||||
0,0x0790,0,0,0,0,0,0,0,0,0,0,0,\
|
||||
0,0,0,0,0,\
|
||||
TposspeedEqep_init,\
|
||||
TposspeedEqep_Calc,\
|
||||
TposspeedEqep_SlowCalc,\
|
||||
TposspeedEqep_IndexEvent,\
|
||||
}
|
||||
|
||||
//! \memberof TposspeedEqep
|
||||
void TposspeedEqep_init(TposspeedEqep*);
|
||||
//! \memberof TposspeedEqep
|
||||
void TposspeedEqep_Calc(TposspeedEqep*);
|
||||
//! \memberof TposspeedEqep
|
||||
void TposspeedEqep_SlowCalc(TposspeedEqep*);
|
||||
//! \memberof TposspeedEqep
|
||||
void TposspeedEqep_IndexEvent(TposspeedEqep*);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
83
Vinclude/V_RTC_Clock.h
Normal file
83
Vinclude/V_RTC_Clock.h
Normal file
@ -0,0 +1,83 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_RTC_Clock.h
|
||||
\brief Ìîäóëü ðàáîòû ñ ÷àñàìè ðåàëüíîãî âðåìåíè
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". Âñå ïðàâà çàùèùåíû. http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_rmp_ctrl Çàäàò÷èê èíòåíñèâíîñòè (ñì. TRMPCtrl)
|
||||
|
||||
@{
|
||||
*/
|
||||
#ifndef V_RTC_CLOCK_H_
|
||||
#define V_RTC_CLOCK_H_
|
||||
|
||||
#define RTC_SLAVE_ADDRESS 0x68 // Äëÿ RTC DS1340 àäðåñ 1101 000b = 0x68 (õîòÿ â ðóêîâîäñòâå îíè åãî êàê áû äîïîëíÿþò íóë¸ì
|
||||
// è ïîëó÷àþò 1101 0000b = 0xD0)
|
||||
#define RTC_WRITE_ERROR 1
|
||||
#define RTC_READ_ERROR 2
|
||||
#define RTC_TIMEOUT_ERROR 3
|
||||
|
||||
#define RTC_TIMEOUT 1000 // Êîëè÷åñòâî îæèäàíèÿ øèíû
|
||||
#define RTC_SECOND_WAITING_TIMEOUT 10000 // Âðåìÿ, â òå÷åíèå êîòîðîãî äîëæíà ñìåíèòüñÿ ñåêóíäà (çàäàåòñÿ â ìñ). Åñëè íå ìåíÿåòñÿ, çíà÷èò ÷àñû íå ðàáîòàþò.
|
||||
|
||||
struct SRTCClock{
|
||||
Uint16 ms; // Íà âñÿêèé
|
||||
Uint16 msInDay; // Ìèëèïèñþëè ñ íà÷àëà ñóòîê
|
||||
Uint16 error; // Êîä îøèáêè
|
||||
Uint16 tryCounter; // Ñ÷åò÷èê îæèäàíèé øèíû
|
||||
|
||||
Uint16 second;
|
||||
Uint16 minute;
|
||||
Uint16 hour;
|
||||
|
||||
Uint16 DOW; // DayOfWeek - äåíü íåäåëè (ïóñòü áóäåò, ÷òî, æàëêî ÷òî ëè?)
|
||||
Uint16 day; // Date - ýòî ÷èñëî ìåñÿöà
|
||||
Uint16 month;
|
||||
Uint16 year;
|
||||
|
||||
Uint32 packed_time; // Âðåìÿ, óïàêîâàííîå â ñëîâî
|
||||
Uint32 timeToSet; // Âðåìÿ, êîòîðîå íóæíî óñòàíîâèòü íà ÷àñàõ, óïàêîâàííîå â ñëîâî
|
||||
|
||||
Uint16 setTimeFlag;
|
||||
Uint16 readTimeFlag;
|
||||
|
||||
Uint16 secondPrev;
|
||||
Uint16 stoppedCounter;
|
||||
Uint16 ClockOk;
|
||||
void (*init)(volatile struct SRTCClock*); // Èíèöèàëèçàöèÿ
|
||||
void (*read)(volatile struct SRTCClock*); // Ïðî÷èòàòü âðåìÿ èç ÷àñèêîâ
|
||||
void (*set)(volatile struct SRTCClock*); // Ïèñüíóòü âðåìÿ â ÷àñèêè
|
||||
void (*msCalc)(volatile struct SRTCClock*);
|
||||
void (*slowCalc)(volatile struct SRTCClock*);
|
||||
};
|
||||
|
||||
typedef volatile struct SRTCClock TRTCClock;
|
||||
|
||||
#define RTC_CLOCK_DEFAULTS {0,0,0,0, 0,0,0, 0,0,0,0, 0,0, 0,0, 0,0,0,\
|
||||
RTC_Clock_Init,\
|
||||
RTC_Clock_Read_Time,\
|
||||
RTC_Clock_Set_Time,\
|
||||
RTC_Clock_Ms_Calc,\
|
||||
RTC_Clock_Slow_Calc}
|
||||
|
||||
void RTC_Clock_Init (TRTCClock *);
|
||||
void RTC_Clock_Read_Time (TRTCClock *);
|
||||
void RTC_Clock_Set_Time (TRTCClock *);
|
||||
void RTC_Clock_Ms_Calc (TRTCClock *);
|
||||
void RTC_Clock_Slow_Calc (TRTCClock *);
|
||||
|
||||
#endif /* V_I2CCLOCK_H_ */
|
119
Vinclude/V_SSI_Encoder.h
Normal file
119
Vinclude/V_SSI_Encoder.h
Normal file
@ -0,0 +1,119 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_SSI_Encoder.h
|
||||
\brief Ìîäóëü îöåíêè ñêîðîñòè è ïîëîæåíèÿ ïðè ïîìîùè öèôðîâîãî ýíêîäåðà, ðàáîòàþùåãî ïî èíòåðôåéñó SSI (ñì. TSSI_Encoder)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.0 25/04/2016
|
||||
|
||||
\defgroup V_SSI_Encoder Ìîäóëü îöåíêè ñêîðîñòè è ïîëîæåíèÿ ïðè ïîìîùè SSI Encoder (ñì. TSSI_Encoder)
|
||||
|
||||
\addtogroup V_SSI_Encoder
|
||||
@{*/
|
||||
|
||||
|
||||
#include "V_IQmath.h"
|
||||
#include "filter.h"
|
||||
#ifndef V_SSI_ENCODER_H
|
||||
#define V_SSI_ENCODER_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \class TSSI_Encoder
|
||||
\brief Ìîäóëü îáðàáîòêè ýíêîäåðà, ðàáîòàþùåãî ïî SSI (óïðîùåííûé SPI). À èìåííî äëÿ äàò÷èêà HENGSTLER absolute encoder AC 58.
|
||||
|
||||
Êëàññ \a TSSI_Encoder, îñíîâàííûé íà ñòðóêòóðå SSI_Encoder,
|
||||
ÿâëÿåòñÿ ìîäóëåì äëÿ îïðåäåëåíèÿ óãëîâîãî ïîëîæåíèÿ è ñêîðîñòè ðîòîðà
|
||||
äâèãàòåëÿ ïî äàííûì îò ýíêîäåðà, ðàáîòàþùåãî ïî SSI.
|
||||
Äàò÷èê ïðåäïîëàãàåòñÿ ïîäêëþ÷àòü íà ðàçúåì J8 ïëàòû èç êîìïëåêòà DRV8301-HC-EVM.
|
||||
Âîò òîëüêî ìèêðîñõåìó ãàëüâàíè÷åñêîé ðàçâÿçêè (U5) Texas òóäà ïîñòàâèëè ïî÷åìó-òî òàêîé ñòîðîíîé, ÷òî ìèêðîêîíòðîëåð
|
||||
ðàáîòàåò êàê slave ñòðîéñòâî. ×òîáû ñäåëàòü åãî ìàñòåðîì, íóæíî ïîñòàâèòü äðóãóþ àíàëîãè÷íóþ ìèêðîñõåìó, èëè...
|
||||
ïåðåâåðíóòü U5 ââåðõ íîãàìè, ïîñòàâèâ ìàðêèðîâêîé âíèç, ëàïêàìè ê âåðõó :)
|
||||
*/
|
||||
|
||||
//! ñì. TSSI_Encoder
|
||||
struct S_SSI_Encoder {
|
||||
Uint32 resol; //!<INPUT: ðàçðåøåíèå äàò÷èêà â ìåòêàõ/îáîðîò;
|
||||
float resol_inv; //!<îáðàòíàÿ âåëè÷èíà ê ðàçðåøåíèþ äàò÷èêà resol
|
||||
Uint16 pole_pairs; //!<INPUT: ÷èñëî ïàð ïîëþñîâ;
|
||||
Uint16 rotation_dir; //!<INPUT: íàïðàâëåíèå âðàùåíèÿ
|
||||
|
||||
float speed_nom; //!<INPUT: íîìèíàëüíàÿ ñêîðîñòü â îá/ìèí;
|
||||
_iq speed_elec; //!<OUTPUT: ýëåêòðè÷åñêàÿ ñêîðîñòü â Q24(îòíîñèòåëüíûå åäèíèöû)
|
||||
_iq theta_elec; //!<OUTPUT: ýëåêòðè÷åñêèé óãîë â Q24(îòíîñèòåëüíûå åäèíèöû)
|
||||
Uint16 Poscnt_res; //!<Ìåõàíè÷åñê.óãîë â ìåòêàõ;
|
||||
|
||||
Uint16 Poscnt_resPrev; //!<Ìåõàíè÷åñê.óãîë â ìåòêàõ ïðåäûäóùåå çíà÷åíèå;
|
||||
_iq theta_mech; //!<Ìåõàíè÷åñêèé óãîë;
|
||||
_iq prevThetaMech; //!<Ìåõàíè÷åñêèé óãîë ïðåäûäóùåå çíà÷åíèå;
|
||||
_iq theta_el_tmp; //!<TEMPORARY: ýëåêòðè÷åñêèé óãîë;
|
||||
_iq theta_mech_filtered; //!<Ìåõàíè÷åñêèé óãîë ôèëüòðîâàííûé;
|
||||
_iq theta_mech_filterK; //!<Êîýôôèöèåíò ôèëüòðà ìåõ. óãëà;
|
||||
|
||||
_iq AngleOffset;//!< Ñìåùåíèå ýëåêòðè÷åñêîãî óãëà â ãðàäóñàõ
|
||||
int16 RevolutionCounter; // Êîëè÷åñòâî ìåõàíè÷åñêèõ îáîðîòîâ;
|
||||
|
||||
int16 Poscnt_resContinouosInt8;//!<Ìåõàíè÷åñê.óãîë â ìåòêàõ c ó÷åòîì êîë-âà îáîðîòîâ (ïåðåìåííàÿ 8 ðàçðÿäîâ îòñåêàåòñÿ)
|
||||
int16 Poscnt_resContinouosInt;//!<Ìåõàíè÷åñê.óãîë â ìåòêàõ c ó÷åòîì êîë-âà îáîðîòîâ (ïåðåìåííàÿ 16 ðàçðÿäîâ)
|
||||
long Poscnt_resContinouosLong;//!<Ìåõàíè÷åñê.óãîë â ìåòêàõ c ó÷åòîì êîë-âà îáîðîòîâ (ïåðåìåííàÿ 32 ðàçðÿäîâ)
|
||||
_iq theta_mechContinouos; //!<Ìåõàíè÷åñêèé óãîë â ãðàäóñàõ àáñîëþòíûé;
|
||||
_iq theta_elecContinouos; //!<Ýëåêòðè÷åñêèé óãîë â ãðàäóñàõ àáñîëþòíûé;
|
||||
|
||||
void (*init)(volatile struct S_SSI_Encoder*);
|
||||
void (*calc)(volatile struct S_SSI_Encoder*);
|
||||
void (*read)(volatile struct S_SSI_Encoder*);
|
||||
};
|
||||
|
||||
|
||||
|
||||
typedef volatile struct S_SSI_Encoder TSSI_Encoder;
|
||||
|
||||
//! Èíèöèàëèçàòîð ïî-óìîë÷àíèþ.
|
||||
#define SSI_ENCODER_DEFAULTS {0,0,0,0, 0,0,0,0, 0,0,0,0,0,0, 0,0, 0,0,0,0,0,\
|
||||
SSI_Encoder_init,\
|
||||
SSI_Encoder_Calc,\
|
||||
SSI_Encoder_Read,\
|
||||
}
|
||||
|
||||
//! \memberof TSSI_Encoder
|
||||
void SSI_Encoder_init(TSSI_Encoder*);
|
||||
//! \memberof TSSI_Encoder
|
||||
void SSI_Encoder_Calc(TSSI_Encoder*);
|
||||
//! \memberof TSSI_Encoder
|
||||
void SSI_Encoder_Read(TSSI_Encoder*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
140
Vinclude/V_UserMemory.h
Normal file
140
Vinclude/V_UserMemory.h
Normal file
@ -0,0 +1,140 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_UserMemory.h
|
||||
\brief Ðàáîòà ñ ýíåðãîíåçàâèñèìîé ïàìÿòüþ 1921BK01 (ñì. TUserMemory)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_UserMemory Ðàáîòà ñ ýíåðãîíåçàâèñèìîé ïàìÿòüþ (ñì. TUserMemory)
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef V_USERMEMORY_H
|
||||
#define V_USERMEMORY_H
|
||||
|
||||
#include "DSP.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*! \class TUserMemory
|
||||
\brief Ðàáîòà ñ ïîëüçîâàòåëüñêîé ýíåðãîíåçàâèñèìîé ïàìÿòüþ ÌÑ01
|
||||
|
||||
Êëàññ \a TUserMemory, îñíîâàííûé íà ñòðóêòóðå TUserMemory, ïðåäñòàâëÿåò ñîáîé äðàéâåð äëÿ ðàáîòû ñ
|
||||
flash ïàìÿòüþ.\n
|
||||
ïðèìåð èñïîëüçîâàíèÿ:\n
|
||||
äëÿ èíèöèàëèçàöèè\n
|
||||
spimem.init.(&spimem);\n
|
||||
|
||||
äëÿ çàïèñè\n
|
||||
UserMem.spiaddr=0;\n
|
||||
UserMem.startaddr=buff;\n
|
||||
UserMem.data_length=1000;\n
|
||||
UserMem.write(&spimem);\n
|
||||
|
||||
*/
|
||||
|
||||
//! ñì. TUserMemory
|
||||
#define USERMEMORY_USERFLASH_KEY 0xA4420000
|
||||
#define USERMEMORY_MAX_WAITCLOCKS 2000
|
||||
#define USERMEMORY_WRITE_HARDFAULT 0x1
|
||||
#define USERMEMORY_WRITE_TIMEOUT 0x2
|
||||
#define USERMEMORY_READ_HARDFAULT 0x3
|
||||
#define USERMEMORY_READ_TIMEOUT 0x4
|
||||
#define USERMEMORY_OP_OK 0x0
|
||||
|
||||
|
||||
#define USERMEMORY_PAGE_SIZE 256
|
||||
|
||||
|
||||
#define USERMEMORY_CMD_WRITE (1<<0)
|
||||
#define USERMEMORY_CMD_PAGE_ERASE (1<<1)
|
||||
#define USERMEMORY_CMD_FULL_ERASE (1<2)
|
||||
#define USERMEMORY_CMD_READ (1<<3)
|
||||
|
||||
|
||||
|
||||
struct SUserMemory {Uint16 MemStartAddr;//!Àäðåñ íà flash
|
||||
Uint8 *MCUStartAddr8; //!àäðåñ íà ìàññèâ ñ äàííûìè êàê áàéòîâûé óêàçàòåëü
|
||||
Uint16 *MCUStartAddr; //!àäðåñ íà ìàññèâ ñ äàííûìè
|
||||
Uint16 data_length;//!äëèíà äàííûõ
|
||||
int16 receivedCode;//!Ñòàòóñ îïåðàöèè
|
||||
Uint16 waitClocks;//!Ñ÷åò÷èê äëÿ îæèäàíèÿ òàéìàóòà îïåðàöèè
|
||||
Uint16 PageInCache;//!Íîìåð òåêóùåé çàêåøèðîâàííîé ñòðàíèöû
|
||||
Uint16 autoFlushCounter;//!Ñ÷åò÷èê äëÿ ñîõðàíåíèÿ êåøà íà ôëåø ïî òàéìàóòó
|
||||
Uint8 PageRAM_and_FLASH_IdenticalFlag;//!Ôëàã î òîì, ÷òî äàííûå â êåøå è íà ôëåøå èäåíòè÷íû
|
||||
Uint8 NeedFlushRequest;//ôëàã çàïðîñà íà çàïèñü äàííûõ èç êåøà íà ôëåø
|
||||
Uint8 cacheArr[USERMEMORY_PAGE_SIZE];//êåø äàííûõ - îäíà ñòðàíèöà ïàìÿòè
|
||||
void (*init)(struct SUserMemory*);
|
||||
void (*write)(struct SUserMemory*);
|
||||
void (*read)(struct SUserMemory*);
|
||||
void (*full_erase)(struct SUserMemory*);
|
||||
void (*flush)(struct SUserMemory*);
|
||||
void (*ms_calc)(struct SUserMemory*);
|
||||
void (*slow_calc)(struct SUserMemory*);
|
||||
};
|
||||
|
||||
typedef struct SUserMemory TUserMemory;
|
||||
|
||||
//!Èíèöèàëèçàòîð ïî óìîë÷àíèþ
|
||||
#define USERMEMORY_DEFAULTS {0,0,0,0,0,0,0,0,0,0, \
|
||||
{0},\
|
||||
USERMEMORY_Init, \
|
||||
USERMEMORY_Write,\
|
||||
USERMEMORY_Read,\
|
||||
USERMEMORY_Full_Erase,\
|
||||
USERMEMORY_Flush,\
|
||||
USERMEMORY_ms_calc,\
|
||||
USERMEMORY_slow_calc,\
|
||||
}
|
||||
|
||||
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Init(TUserMemory*);
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Write(TUserMemory*);
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Read(TUserMemory*);
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Full_Erase(TUserMemory*);
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_ReadToCache(TUserMemory *p, int16 pageNum);
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_WriteFromCache(TUserMemory *p, int16 pageNum);
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Flush(TUserMemory *p);
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_ms_calc(TUserMemory *p);
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_slow_calc(TUserMemory *p);
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_UpdateCurrentPage(TUserMemory *p, Uint16 spiaddr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
145
Vinclude/V_adc.h
Normal file
145
Vinclude/V_adc.h
Normal file
@ -0,0 +1,145 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_adc.h
|
||||
\brief Ìîäóëü îáðàáîòêè ÀÖÏ (ñì. TAdcDrv)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_adc Ìîäóëü îáðàáîòêè ÀÖÏ (ñì. TAdcDrv)
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
#ifndef V_ADC_H
|
||||
#define V_ADC_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/*! \class TAdcDrv
|
||||
\brief Ìîäóëü îáðàáîòêè ÀÖÏ
|
||||
|
||||
Êëàññ \a TAdcDrv, îñíîâàííûé íà ñòðóêòóðå SAdcDrv, ñîäåðæèò â ñåáå
|
||||
ìåòîäû äëÿ îáðàáîòêè ðåçóëüòàòîâ ÀÖÏ. À èìåííî: ñ÷èòûâàíèå, íîðìèðîâêó è
|
||||
ïðèâåäåíèå ê îòíîñèòåëüíûì åäèíèöàì, ôèëüòðàöèþ. Ó êàæäîãî èçìåðÿåìîãî ñèãíàëà
|
||||
åñòü êàê ìèíèìóì äâà ïàðàìåòðà äëÿ íàñòðîéêè: êîýôôèöèåíò óñèëåíèÿ è ñìåùåíèå.
|
||||
Íàñòðîéêó äàò÷èêîâ æåëàòåëüíî ïðîèçâîäèòü òàê: ïîäàòü íóëåâîé ñèãíàë è íàñòðîèòü
|
||||
ñìåùåíèå, ÷òîáû èçìåðÿåìîå çíà÷åíèå ïîêàçûâàëî íîëü. Ïîäàòü óðîâåíü ñèãíàëà, áëèçêèé
|
||||
ê íîìèíàëüíîìó è íàñòðîèòü êîýôôèöèåíò óñèëåíèÿ, ÷òîáû èçìåðåííîå çíà÷åíèå ñîîòâåòñòâîâàëî
|
||||
äåéñòâèòåëüíîñòè.*/
|
||||
|
||||
//! ñì. TAdcDrv
|
||||
struct SAdcDrv
|
||||
{
|
||||
int16 Imeas_a_gain; //!< Êîýôôèöèåíò óñèëåíèÿ.
|
||||
int16 Imeas_a_offset; //!< Ñìåùåíèå íóëÿ.
|
||||
int32 Imeas_a; //!< Èçìåðåííîå çíà÷åíèå óñðåäíåííîå.
|
||||
int32 IaGainNom; //!< Âñïîìîãàòåëüíûé êîýôô. óñèëåíèÿ.
|
||||
int32 IA_temp; //!<Âðåìåííàÿ ïåðåìåííàÿ
|
||||
|
||||
int16 IASampleLength; //äëèíà âûáîðêè (êîë-âî òî÷åê íà ïåðèîäå ØÈÌ)
|
||||
int16 IAPointer; //íîìåð ïîñëåäíåé âûáîðêè
|
||||
int16 IABuf[4]; //ìàññèâ òî÷åê äëÿ óñðåäíåíèÿ
|
||||
|
||||
|
||||
int16 Imeas_b_gain;
|
||||
int16 Imeas_b_offset;
|
||||
int32 Imeas_b;
|
||||
int32 IbGainNom;
|
||||
int32 IB_temp;
|
||||
|
||||
int16 IBSampleLength; //äëèíà âûáîðêè (êîë-âî òî÷åê íà ïåðèîäå ØÈÌ)
|
||||
int16 IBPointer; //íîìåð ïîñëåäíåé âûáîðêè
|
||||
int16 IBBuf[4]; //ìàññèâ òî÷åê äëÿ óñðåäíåíèÿ
|
||||
|
||||
int16 Imeas_c_gain;
|
||||
int16 Imeas_c_offset;
|
||||
int32 Imeas_c;
|
||||
int32 IcGainNom;
|
||||
int16 IC_temp;
|
||||
|
||||
int16 ICSampleLength; //äëèíà âûáîðêè (êîë-âî òî÷åê íà ïåðèîäå ØÈÌ)
|
||||
int16 ICPointer; //íîìåð ïîñëåäíåé âûáîðêè
|
||||
int16 ICBuf[4]; //ìàññèâ òî÷åê äëÿ óñðåäíåíèÿ
|
||||
|
||||
int16 Udc_meas_gain;
|
||||
int16 Udc_meas_offset;
|
||||
int32 Udc_meas;
|
||||
int32 UdcGainNom;
|
||||
int16 Udc_temp;
|
||||
|
||||
int16 UdcSampleLength; //äëèíà âûáîðêè (êîë-âî òî÷åê íà ïåðèîäå ØÈÌ)
|
||||
int16 UdcPointer; //íîìåð ïîñëåäíåé âûáîðêè
|
||||
int16 UdcBuf[4]; //ìàññèâ òî÷åê äëÿ óñðåäíåíèÿ
|
||||
|
||||
int16 T_meas_gain; //!< Êîýôôèöèåíò óñèëåíèÿ.
|
||||
int32 T_meas; //!< Èçìåðåííîå çíà÷åíèå óñðåäíåííîå.
|
||||
int32 TGainNom; //!< Âñïîìîãàòåëüíûé êîýôô. óñèëåíèÿ.
|
||||
int16 T_temp; //!<Âðåìåííàÿ ïåðåìåííàÿ
|
||||
|
||||
void (*init)(struct SAdcDrv *);
|
||||
void (*fast_calc)(struct SAdcDrv*);
|
||||
void (*ms_calc)(struct SAdcDrv*);
|
||||
void (*slow_calc)(struct SAdcDrv*);
|
||||
};
|
||||
|
||||
|
||||
typedef struct SAdcDrv TAdcDrv;
|
||||
|
||||
//!Èíèöèàëèçàòîð ïî óìîë÷àíèþ.
|
||||
#define ADC_DRV_DEFAULTS {\
|
||||
54,0,0,0,0, \
|
||||
4,0,{0}, \
|
||||
54,0,0,0,0, \
|
||||
4,0,{0}, \
|
||||
54,0,0,0,0, \
|
||||
4,0,{0}, \
|
||||
800,0,0,0,0, \
|
||||
4,0,{0}, \
|
||||
100,0,0,0, \
|
||||
AdcDrv_init,\
|
||||
AdcDrv_fast_calc,\
|
||||
AdcDrv_ms_calc,\
|
||||
AdcDrv_slow_calc,\
|
||||
}
|
||||
|
||||
|
||||
//! \memberof TAdcDrv
|
||||
void AdcDrv_init(TAdcDrv*);
|
||||
//! \memberof TAdcDrv
|
||||
void AdcDrv_slow_calc(TAdcDrv*);
|
||||
//! \memberof TAdcDrv
|
||||
void AdcDrv_fast_calc(TAdcDrv*);
|
||||
//! \memberof TAdcDrv
|
||||
void AdcDrv_ms_calc(TAdcDrv*);
|
||||
|
||||
|
||||
extern Uint16 rawResNAvg[16] __attribute__((deprecated));
|
||||
extern Uint16 rawResAvg[4] __attribute__((deprecated));
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
77
Vinclude/V_bits_to_enum_numbers.h
Normal file
77
Vinclude/V_bits_to_enum_numbers.h
Normal file
@ -0,0 +1,77 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_bits_to_enum_numbers.h
|
||||
\brief Ìîäóëü "ëèñòàíèÿ" áèòîâûõ ïåðåìåííûõ (ñì. TBitsToEnumNums)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_bits_to_enum_numbers Ìîäóëü "ëèñòàíèÿ" áèòîâûõ ïåðåìåííûõ (ñì. TBitsToEnumNums)
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef V_BITS_TO_ENUM_NUMS_H
|
||||
#define V_BITS_TO_ENUM_NUMS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
//!êîëè÷åñòâî çàðàçåðâèðîâàííûõ ìåñò äëÿ áèòîâûõ ïåðåìåííûõ
|
||||
#define NUM_OF_W_PTRS 2
|
||||
|
||||
/*! \class TBitsToEnumNums
|
||||
\brief Ìîäóëü "ëèñòàíèÿ" áèòîâûõ ïåðåìåííûõ
|
||||
|
||||
Êëàññ \a TBitsToEnumNums, îñíîâàííûé íà ñòðóêòóðå SBitsToEnumNums, ïðåîáðàçóåò
|
||||
áèòîâûå ïåðåìåííûå â ÷èñëà (ñîîòâåòñòâóþùèå íîìåðàì áèòîâ âõîäíîé ïåðåìåíîé),
|
||||
ìåíÿþùèåñÿ ñ çàäàííûì èíòåðâàëîì. Çíà÷åíèå â ñàìîì ìëàäøåì áèòå ñîîòâåòñòâóåò 1.
|
||||
Âûäàåò 0 åñëè íèêàêèå áèòû â ïðîâåðÿåìûõ ñëîâàõ íå óñòàíîâëåíû. Ïðåäïîëàãàåòñÿ äëÿ
|
||||
"ïðîëèñòûâàíèÿ" áèòîâ ñëîâ àâàðèé è ïðåäóïðåæäåíèé â öåëÿõ âûâîäà íà ÏÓ. */
|
||||
|
||||
//! ñì. TBitsToEnumNums
|
||||
struct SBitsToEnumNums
|
||||
{
|
||||
Uint16 out_refresh_devisor;//!< äåëèòåëü, çàäàþùèé òåìï ëèñòàíèÿ
|
||||
Uint16 counter;//!<ñ÷åò÷èê òàéìàóòà ëèñòàíèÿ
|
||||
Uint16 num_of_words;//!<êîë-âî áèòîâûõ ïåðåìåííûõ
|
||||
Uint16 last_word;//!<òåêóùåå ñëîâî
|
||||
Uint16 last_bit;//!<òåêóùèé áèò
|
||||
Uint16 *w_ptrs[NUM_OF_W_PTRS]; //!<óêàçàòåëü íà áèòîâûå ïåðåìåííûå (íåñêîëüêî)
|
||||
Uint16 output;//!<âûõîä ìîäóëÿ (ëèñòàþùååñÿ ÷èñëî)
|
||||
void (*calc)(volatile struct SBitsToEnumNums*);
|
||||
};
|
||||
|
||||
typedef volatile struct SBitsToEnumNums TBitsToEnumNums;
|
||||
|
||||
|
||||
//!èíèöèàëèçàòîð ïî óìîë÷àíèþ
|
||||
#define BITS_TO_ENUM_NUMS_DEFAULTS {1000,0,4,0,0,{0},0,\
|
||||
BitsToEnumNums,\
|
||||
}
|
||||
//! \memberof TBitsToEnumNums
|
||||
void BitsToEnumNums(TBitsToEnumNums*);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
128
Vinclude/V_common.h
Normal file
128
Vinclude/V_common.h
Normal file
@ -0,0 +1,128 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file v_common.h
|
||||
\brief Объявление структур данных различного назначения, которые еще слишком малы для того, чтобы
|
||||
организовывать их в отдельный модуль
|
||||
\author ООО "НПФ Вектор". Все права защищены. http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup v_common Объявление структур данных различного назначения
|
||||
|
||||
@{*/
|
||||
|
||||
#ifndef V_COMMON_H
|
||||
#define V_COMMON_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
//!Битовое поле для битового статуса системы управления
|
||||
typedef struct
|
||||
{
|
||||
unsigned int ready:
|
||||
1;
|
||||
unsigned int running:
|
||||
1;
|
||||
unsigned int fault:
|
||||
1;
|
||||
unsigned int alarm:
|
||||
1;
|
||||
unsigned int testing:
|
||||
1;
|
||||
unsigned int overheat:
|
||||
1;
|
||||
} DRV_STATUS_BIT;
|
||||
|
||||
//!Структура для статуса системы управления (содержит DRV_STATUS_BIT)
|
||||
typedef union
|
||||
{
|
||||
int all;
|
||||
DRV_STATUS_BIT bit;
|
||||
}TDrvStatus;
|
||||
|
||||
|
||||
//!Битовое поле слова управления
|
||||
typedef struct
|
||||
{
|
||||
unsigned int start:
|
||||
1;
|
||||
unsigned int stop:
|
||||
1;
|
||||
unsigned int trip_reset:
|
||||
1;
|
||||
unsigned int reserved:
|
||||
5;
|
||||
} CMD_BIT;
|
||||
|
||||
//!Структура слова управления (содержит DRV_STATUS_BIT)
|
||||
typedef union
|
||||
{
|
||||
unsigned int all;
|
||||
CMD_BIT bit;
|
||||
}TCmd;
|
||||
|
||||
|
||||
//! Структура, содержащия основные задания для привода
|
||||
typedef volatile struct
|
||||
{
|
||||
long speed_ref;//!< Задание скорости
|
||||
long Iq_ref;//!< Задание токоограничения для векторной системы управления
|
||||
long i_flux_ref;//!< Задание тока для замкнутой по току системы управления (не векторной)
|
||||
long theta_elec;//!< Задание углового положения вектора тока/напряжения
|
||||
long ua_ref, uf_ref; // Задания тока якоря и тока ОВ для ДПТ
|
||||
long DCMspeed_ref;//!< Задание скорости
|
||||
} TRefs;
|
||||
|
||||
//! Структура для хранения параметров привода, двигателя, базовых величин системы управления
|
||||
typedef struct
|
||||
{
|
||||
long Rs;//!< Сопротивление фазы статора
|
||||
long Ls;//!< Индуктивность фазы статора
|
||||
int p;//!< Количество пар полюсов
|
||||
int I_nom;//!< Номинальный (базовый) фазный ток в формате 16.0
|
||||
long _1_I_nom;//!< 1/I_nom
|
||||
int U_nom;//!< Номинальное (базовое) фазное напряжение в формате 16.0
|
||||
long _1_U_nom;//!< 1/U_nom
|
||||
int Udc_nom;//!< Номинальное (базовое) напряжение ЗПТ в формате 16.0
|
||||
long _1_Udc_nom;//!< 1/Udc_nom
|
||||
int speed_nom;//!< Номинальная (базовая) скорость в формате 16.0
|
||||
int freq_nom;//!< Номинальная (базовая) частота в формате 16.0
|
||||
int power;//!< Номинальная (базовая) мощность в формате 16.0
|
||||
int sens_type;//!< Тип датчика положения
|
||||
} TDrvParams;
|
||||
|
||||
|
||||
//! Структура для битовых "переключателей", таких как направление вращения, разрешение рекуперации и т.п.
|
||||
typedef struct {
|
||||
Uint16 recuperation_ena;//!< Разрешение рекуперации энергии при торможении
|
||||
Uint16 rotation_dir;//!< Направление вращения
|
||||
Uint16 Reboot;//!< Программная перезагрузка
|
||||
Uint16 AutoOffset;//!< автосмещение АЦП
|
||||
Uint16 HardwareType;//!< Тип железа, под который собран проект
|
||||
Uint16 excitation_ena;//!< Разрешение возбудителя
|
||||
} TSysSwitches;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
224
Vinclude/V_data_log.h
Normal file
224
Vinclude/V_data_log.h
Normal file
@ -0,0 +1,224 @@
|
||||
/*!
|
||||
\file v_data_log.h
|
||||
\brief 4-х канальный логгер длЯ осциллографированиЯ в реальном времени (см. TDataLog)
|
||||
В версии 2.0 реализован 32-битный режим работы. Основные положения:
|
||||
Тип данных даталоггера определяется символьной константой в заголовочном файле 'V_data_log.h'
|
||||
(один из вариантов нужно раскомментировать):
|
||||
//#define DLOG_DATA_SIZE 16
|
||||
#define DLOG_DATA_SIZE 32
|
||||
Для 16-битного режима даталоггер работает "классическим" методом. Старый Юникон работает как было.
|
||||
Новый Юникон при этом не получает флаг 32-битного режима (см. ниже) и работает по "классическому" алгоритму
|
||||
(правда, буфер принимаемых данных у него теперь 32-битный, но это тонкости). При буферной передаче каждый
|
||||
канал передаётся, как и раньше, одним запросом.
|
||||
32-битный режим:
|
||||
В переменную 'dlog.control' добавлен флаг '32-битные данные', по которому новый Юникон узнаёт тип даталоггера.
|
||||
При SDO-чтении осциллограмм данные, как и раньше, выдвигаются через 32-битную переменную 'dlog.next_value_var'
|
||||
(там, кроме 16-битного значения, есть всякие поля). В неё добавлены два флага:
|
||||
- флаг, что в поле "значение" - старшие 16 бит точки
|
||||
- флаг, что переменная 16-разрядная
|
||||
Юникон сначала запрашивает младшую часть значения, потом - старшую и т.д. по всем точкам.
|
||||
Если переменная 16-разрядная, то старшая часть не запрашивается. При буферной передаче:
|
||||
Т.к. один буферный запрос ограничен у нас 256-тью 16-битными словами, то Юникон сначала запрашивает
|
||||
первые 256 слов (128 32-битных точек), затем - остальные 256 слов. Т.е. используется два буферных запроса.
|
||||
|
||||
\author Коллектив ООО НПФ Вектор
|
||||
\version v 2.0 10/04/2017
|
||||
\defgroup v_data_log Цифровой осциллограф (см. TDataLog)
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
#ifndef V_DATA_LOG_H
|
||||
#define V_DATA_LOG_H
|
||||
|
||||
#include "CANOpen_drv.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
// Размер значений, передаваемых через логгер (бит)
|
||||
//#define DLOG_DATA_SIZE 16
|
||||
#define DLOG_DATA_SIZE 32
|
||||
|
||||
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
typedef int16 type_data;
|
||||
#elif DLOG_DATA_SIZE == 32
|
||||
typedef int32 type_data;
|
||||
#endif
|
||||
|
||||
|
||||
//! Размер массивов длЯ осциллографированиЯ.
|
||||
|
||||
//!Если нужно менЯть, то это делать надо не только тут - слишком много завЯзано на это число
|
||||
//!Переделать сложно, так как на это число завЯзка косвеннаЯ: например, длЯ ускорениЯ работы
|
||||
//!применЯютсЯ такие конструкции: p->Wcounter&=0xFF; Где FF - маска (символизирует 256 точек)
|
||||
#define NUMBER_SAMPLES 256
|
||||
|
||||
/*! \class TDataLog
|
||||
\brief 4-х канальный логгер длЯ осциллографированиЯ в реальном времени
|
||||
|
||||
Класс \a TDataLog, основанный на структуре SDataLog, позволЯет записывать выбранные 4 переменных в массивы
|
||||
из 255 точек с заданной дискретизацией по времени. Кроме того, имеет
|
||||
свЯзь с драйвером CANOpen длЯ автоматизации указаниЯ этих переменных: можно
|
||||
"зарЯдить" в даталоггер любой существующий элемент словарЯ.*/
|
||||
|
||||
//! см. TDataLog
|
||||
struct SDataLog
|
||||
{
|
||||
type_data buff[(NUMBER_SAMPLES*4)]; //4 массива для отснятых осциллограмм, слепленные в один большой
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
type_data *dlog_iptr1; //!< указатели на переменные для записи (например. ток фазы A, скорость и т.д.)
|
||||
type_data *dlog_iptr2; //!< Input: Second input pointer (Q15)
|
||||
type_data *dlog_iptr3;
|
||||
type_data *dlog_iptr4;
|
||||
#endif
|
||||
int dlog_cntr_max; //!< Parameter: Maximum number of samples
|
||||
Uint16 Wcounter; //!< Счетчик по массиву длЯ записи
|
||||
Uint16 Rcounter; //!< Счетчик по массиву длЯ чтениЯ
|
||||
type_data* dl_buffer1_adr; //!< Указатели на массивы, где лежат отснятые осциллограммы
|
||||
type_data* dl_buffer2_adr; //!< Parameter: Buffer starting address 2
|
||||
type_data* dl_buffer3_adr;
|
||||
type_data* dl_buffer4_adr;
|
||||
|
||||
type_data upload_buff[NUMBER_SAMPLES]; //массив для отправки осциллограммы в юникон. Сюда копируется осциллограмма из одного из четырех массивов buff со смещением, чтобы начало осциллограммы было в начале массива.
|
||||
type_data* dl_upload_buffer_adr; //указатель на массив для отправки.
|
||||
Uint32 trig_shift; //сдвиг первой точки после срабатывания триггера. Используется, чтобы задать, сколько точек предыстории сохранять.
|
||||
Uint16 trig_shift_int; //то же, переведенное в точки
|
||||
Uint16 first_point_written; //первая точка, относящаяся к записываемой осциллограмме с учетом длины предыстории и точки срабатывания триггера
|
||||
Uint16 prehistory_length; //длина записанной предыстории (если даталоггер переинициализировался кнопкой "обновить", она обнуляется)
|
||||
Uint16 valid_points_num; //счетчик валидных точек предыстории, записанных после переинициализации кнопкой "обновить" в юниконе
|
||||
|
||||
/*! Режимов работы четыре:\n
|
||||
0 - стоп\n
|
||||
1 - однократнаЯ запись\n
|
||||
2 - запись по кругу без остановки\n
|
||||
3 - однократнаЯ запись одной переменной во все 4 массива последовательно, длЯ получениЯ длинной осциллограммы.\n
|
||||
Устанавливать переменную надо только вызовом функции set_mode! */
|
||||
Uint16 mode_reset; //!< задаетсЯ режим работы
|
||||
Uint16 mode_reset_prev; //!< предыдущий режим работы
|
||||
int E; // флаг энтри
|
||||
|
||||
/*! "control" имеет 32 разрЯда. Первые 16 бит - флаги, последние 16 бит - установка разреживания.\n
|
||||
9 8 7 6 5 4 3 2 1 0\n
|
||||
| x | x | x | x | x | x | x | x | x | x |\n
|
||||
| | | | | | первые 4 бита - какие из 4х переменых интересуют (какие адреса обновлЯть, какие данные записывать)\n
|
||||
| | | | 2 бита - желаемый режим даталоггера: 0, 1, 2\n
|
||||
| | | бит "данные готовы" - устанавливаетсЯ контроллером\n
|
||||
| | бит "поддерживается блочная передача"\n
|
||||
| бит "32-битные данные"\n
|
||||
резерв */
|
||||
long control; //!< управление даталоггером через внешние программы
|
||||
|
||||
unsigned int WriteDelimiter; //!<делитель данных при записи
|
||||
unsigned int WriteDelimiterCounter; //!<Счетчик длЯ делителЯ
|
||||
long ind_subind1; //!<записываетсЯ индекс и подындекс длЯ словарЯ
|
||||
long ind_subind2;
|
||||
long ind_subind3;
|
||||
long ind_subind4;
|
||||
unsigned long next_value_var; //!<через эту переменную выдвигаютсЯ записанные значениЯ при считывании:
|
||||
//!<биты 0-15: значение точки
|
||||
//!<биты 16-23: Rcounter (отдаваемая точка)
|
||||
//!<биты 24-25: buff_num
|
||||
//!<бит 26: флаг, что в поле "значение" - старшие 16 бит точки (используется при DLOG_DATA_SIZE = 32)
|
||||
//!<бит 27: флаг, что переменная 16-разрядная (используется при DLOG_DATA_SIZE = 32)
|
||||
Uint16 StartBits;
|
||||
int buff_num; //!<номер массива, из которого идет выдвижение значений в next_value_var
|
||||
int ResetAfterStart; //!<флаг обнулениЯ счетчика записи при запуске
|
||||
Uint16 OneShotOperation; //!<флаг синхронизации осциллографа только по первому событию (переход в 1 возможен только из 2)
|
||||
TCo_OdVars *pco_vars; //!<адрес структуры драйвера CANopen
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
int highPartOfValue; //!<флаг выдачи старшей части
|
||||
TObjectInfo object1Info; //!<информация о записываемом объекте №1
|
||||
TObjectInfo object2Info; //!<информация о записываемом объекте №2
|
||||
TObjectInfo object3Info; //!<информация о записываемом объекте №3
|
||||
TObjectInfo object4Info; //!<информация о записываемом объекте №4
|
||||
#endif
|
||||
void (*update)(volatile struct SDataLog *); //!<Pointer to update function
|
||||
void (*set_mode)(Uint16 mode_reset,volatile struct SDataLog *); //!<Pointer to set_mode function
|
||||
void (*background_analizer)(volatile struct SDataLog *); //!<Pointer to background_analizer function
|
||||
} ;
|
||||
|
||||
typedef volatile struct SDataLog TDataLog;
|
||||
|
||||
|
||||
|
||||
#if defined(CAN_1_ENABLE)
|
||||
#define COX_VARS co1_vars
|
||||
#elif defined(CAN_2_ENABLE)
|
||||
#define COX_VARS co2_vars
|
||||
#endif
|
||||
|
||||
//! Инициализатор по-умолчанию длЯ данного класса
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
#define DATALOG_DEFAULTS { {0},\
|
||||
(type_data *)0x00000300, \
|
||||
(type_data *)0x00000300, \
|
||||
(type_data *)0x00000300, \
|
||||
(type_data *)0x00000300, \
|
||||
NUMBER_SAMPLES, \
|
||||
0,0,\
|
||||
((type_data *)&dlog.buff), \
|
||||
((type_data *)&dlog.buff+NUMBER_SAMPLES), \
|
||||
((type_data *)&dlog.buff+NUMBER_SAMPLES*2), \
|
||||
((type_data *)&dlog.buff+NUMBER_SAMPLES*3), \
|
||||
{0}, ((type_data *)&dlog.upload_buff), 0, 0, 0, 0, 0,\
|
||||
2, 2, 0,\
|
||||
0,\
|
||||
0,0,\
|
||||
0,0,0,0,\
|
||||
0,0,\
|
||||
0,\
|
||||
1,\
|
||||
0,\
|
||||
&COX_VARS,\
|
||||
data_log_update,\
|
||||
dlog_set_mode,\
|
||||
dlog_background_analizer }
|
||||
#endif
|
||||
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
#define DATALOG_DEFAULTS { {0},\
|
||||
NUMBER_SAMPLES, \
|
||||
0,0,\
|
||||
((type_data *)&dlog.buff), \
|
||||
((type_data *)&dlog.buff+NUMBER_SAMPLES), \
|
||||
((type_data *)&dlog.buff+NUMBER_SAMPLES*2), \
|
||||
((type_data *)&dlog.buff+NUMBER_SAMPLES*3), \
|
||||
{0}, ((type_data *)&dlog.upload_buff), 0, 0, 0, 0, 0,\
|
||||
2, 2, 0,\
|
||||
0,\
|
||||
0,0,\
|
||||
0,0,0,0,\
|
||||
0,0,\
|
||||
0,\
|
||||
1,\
|
||||
0,\
|
||||
&COX_VARS,\
|
||||
0,\
|
||||
{ 0 }, { 0 }, { 0 }, { 0 },\
|
||||
data_log_update,\
|
||||
dlog_set_mode,\
|
||||
dlog_background_analizer }
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
//! \memberof TDataLog
|
||||
void data_log_update(TDataLog *);
|
||||
//! \memberof TDataLog
|
||||
void dlog_set_mode(Uint16 mode_reset,TDataLog *);
|
||||
//! \memberof TDataLog
|
||||
void dlog_background_analizer(TDataLog *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
131
Vinclude/V_event_log.h
Normal file
131
Vinclude/V_event_log.h
Normal file
@ -0,0 +1,131 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_event_log.h
|
||||
\brief Ñîõðàíåíèå ñîáûòèé è âðåìåíè âîçíèêíîâåíèß â ÝíÎÇÓ
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.0 2009_01_20
|
||||
|
||||
*/
|
||||
#ifndef W_EVENT_LOG_H
|
||||
#define W_EVENT_LOG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
//#define LOG_BUF_SIZE 50 //ñîõðàíßåì ïîñëåäíèå 50 ñîáûòèé
|
||||
#define LOG_FIFO_SIZE 10 //ðàçìåð ôèôî äëß áóôåðèðîâàíèß ñîîáùåíèé ïðåæäå ÷åì îíè áóäóò çàïèñàíû â SPI
|
||||
//#define LOG_SPI_START_ADDR 3000 //íà÷àëüíûé àäðåñ â SPI
|
||||
|
||||
#define LOG_NUM_LENGTH 2 //äëèíà íîìåðà ñîáûòèß (16áèò) - 2áàéòà
|
||||
#define LOG_TIME_LENGTH 4 //äëèíà âðåìåíè ñîáûòèß (32áèò) - 4áàéòà
|
||||
#define LOG_CODE_LENGTH 2 //äëèíà êîäà ñîáûòèß (16áèò) - 2áàéòà
|
||||
#define LOG_LENGTH LOG_NUM_LENGTH + LOG_TIME_LENGTH + LOG_CODE_LENGTH //îáùàß äëèíà çàïèñè îøèáêè
|
||||
|
||||
#define EVENT_FIFO_SUCCESSFUL 0
|
||||
#define EVENT_FIFO_EMPTY 1
|
||||
#define EVENT_FIFO_FULL 2
|
||||
#define EVENT_FIFO_BUSY 3
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Uint16 ev_num;
|
||||
Uint32 ev_time;
|
||||
Uint16 ev_code;
|
||||
|
||||
}TEvent;
|
||||
|
||||
struct SEventFIFO
|
||||
{
|
||||
Uint16 busy_flag;
|
||||
Uint16 size;
|
||||
Uint16 number_of_msgs;
|
||||
Uint16 read_ptr;
|
||||
Uint16 write_ptr;
|
||||
TEvent msg_array[LOG_FIFO_SIZE];
|
||||
Uint16(*read)(struct SEventFIFO*,TEvent*);
|
||||
Uint16(*write)(struct SEventFIFO*,TEvent*);
|
||||
};
|
||||
|
||||
typedef struct SEventFIFO TEventFIFO;
|
||||
|
||||
#define EVENT_FIFO_DEFAULTS {0,\
|
||||
LOG_FIFO_SIZE,\
|
||||
0,0,0,\
|
||||
{0},\
|
||||
Event_FIFO_Read,\
|
||||
Event_FIFO_Write,\
|
||||
}
|
||||
|
||||
Uint16 Event_FIFO_Read(TEventFIFO*,TEvent*);
|
||||
Uint16 Event_FIFO_Write(TEventFIFO*,TEvent*);
|
||||
|
||||
struct SLogger
|
||||
{
|
||||
Uint16 INTERNAL_last_log_index;
|
||||
Uint16 INTERNAL_last_log_num;
|
||||
Uint16 INTERNAL_last_log_code;
|
||||
Uint16 SPI_buf_size;
|
||||
Uint16 SPI_start_addr;
|
||||
|
||||
Uint32* time_ptr;
|
||||
|
||||
Uint16 bit_fault_written[4]; //ôëàãè çàïèñàííûõ àâàðèé
|
||||
Uint16 WriteCounter; //ñ÷åò÷èê áèòîâ äëÿ çàïèñè àâàðèé â áàíê
|
||||
Uint16 mainDCDCwritten;
|
||||
Uint16 DCDC3phwritten;
|
||||
Uint16 mcwritten;
|
||||
Uint16 chargerwritten;
|
||||
|
||||
TEventFIFO FIFO;
|
||||
void (*init)(volatile struct SLogger*,Uint16 BS,Uint16 SA,Uint32* tptr);
|
||||
void (*background_calc)(volatile struct SLogger*);
|
||||
void (*ms_calc)(volatile struct SLogger*);
|
||||
void (*clear)(volatile struct SLogger*);
|
||||
Uint16(*write)(volatile struct SLogger*,Uint16);
|
||||
void (*read)(volatile struct SLogger*,Uint16,TEvent*);
|
||||
};
|
||||
|
||||
typedef volatile struct SLogger TLogger;
|
||||
|
||||
//ò.ê. ÷àñîâ ðåàëüíîãî âðåìåíè íåò (ÌÊ 30.1), â êà÷åñòâå âðåìåííÎãî ìàðêåðà àâàðèé èñïîëüçóåòñÿ âðåìÿ âêëþ÷åííîãî ñîñòîÿíèÿ
|
||||
#define LOGGER_DEFAULTS {0,0,0,1,0,\
|
||||
(Uint32*)&RTCclock.packed_time,\
|
||||
{0,0,0,0},0,0,0,0,0,\
|
||||
EVENT_FIFO_DEFAULTS,\
|
||||
Logger_Init,\
|
||||
Logger_Background_Calc,\
|
||||
Logger_ms_Calc,\
|
||||
Logger_Clear,\
|
||||
Logger_Event_Write,\
|
||||
Logger_Event_Read,\
|
||||
}
|
||||
|
||||
void Logger_Init(TLogger*,Uint16 BS,Uint16 SA,Uint32* tptr);
|
||||
void Logger_Background_Calc(TLogger*);
|
||||
void Logger_ms_Calc(TLogger*);
|
||||
void Logger_Clear(TLogger*);
|
||||
Uint16 Logger_Event_Write(TLogger*,Uint16);
|
||||
void Logger_Event_Read(TLogger* p,Uint16 shift_index,TEvent* event);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
72
Vinclude/V_fifo.h
Normal file
72
Vinclude/V_fifo.h
Normal file
@ -0,0 +1,72 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_fifo.c
|
||||
\brief Êîëüöåâîé ìàñèâ òèïà FIFO. Ïîçâîëÿåò çàïèñûâàòü äàííûå òèïà "Uint8"
|
||||
ïàêåòàìè ïðîèçâîëüíîé äëèíû.
|
||||
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.0 08/08/2017
|
||||
|
||||
*/
|
||||
|
||||
#ifndef V_FIFO_C_
|
||||
#define V_FIFO_C_
|
||||
|
||||
#define BUFFER_SIZE 64
|
||||
|
||||
#define FIFO_BUSY -1 // Ôèôî çàíÿò
|
||||
#define FIFO_NOT_ENOUGH_SPACE 2 // Íå õâàòàåò ìåñòà äëÿ çàïèñè
|
||||
#define FIFO_NOT_ENOUGH_DATA 3 // Íåò ñòîëüêî äàííûõ, ñêîëüêî õîòÿò âû÷èòàòü
|
||||
#define FIFO_OK 0 // Âñ¸ îê
|
||||
|
||||
|
||||
struct Sfifo;
|
||||
typedef volatile struct Sfifo Tfifo;
|
||||
struct Sfifo {
|
||||
Uint16 busy;
|
||||
Uint16 size; // Ðàçìåð áóôåðà (íàäî)
|
||||
Uint16 wp; // Write pointer
|
||||
Uint16 rp; // Read pointer
|
||||
Uint8 wrapFlag; // Âçâîäèòñÿ â 1, åñëè wp ïåðåø¸ë çà ãðàíèöû áóôåðà;
|
||||
// Ñáðàñûâàåòñÿ, åñëè rp ïåðåø¸ë
|
||||
// Ïîìîãàåò îòñëåäèòü ñèòóàöèþ, êîãäà áóôåðà çàïîëíåí íà 100%: rp == wp && wrap == 1
|
||||
// Ëèáî åñëè áóôåð ïîëíîñòüþ ïóñò: rp == wp && wrap == 0
|
||||
Uint8 buff[BUFFER_SIZE];
|
||||
int16 (*put)(Tfifo*, Uint16, Uint8*);
|
||||
int16 (*get)(Tfifo*, Uint16, Uint8*);
|
||||
int16 (*availSpace)(Tfifo*);
|
||||
int16 (*filledSpace)(Tfifo*);
|
||||
void (*clear)(Tfifo*);
|
||||
};
|
||||
|
||||
int16 Fifo_Put (volatile struct Sfifo*, Uint16, Uint8*);
|
||||
int16 Fifo_Get (volatile struct Sfifo*, Uint16, Uint8*);
|
||||
int16 getFill (Tfifo*);
|
||||
int16 getFreeSpace (Tfifo*);
|
||||
void Fifo_Clear (Tfifo*);
|
||||
|
||||
#define FIFO_DEFAULTS {.size = BUFFER_SIZE,\
|
||||
.put = Fifo_Put,\
|
||||
.get = Fifo_Get,\
|
||||
.availSpace = getFreeSpace,\
|
||||
.filledSpace = getFill,\
|
||||
.clear = Fifo_Clear}
|
||||
|
||||
extern Tfifo fifosha;
|
||||
|
||||
extern Tfifo usbRxBuf;
|
||||
extern Tfifo usbTxBuf;
|
||||
#endif /* V_FIFO_C_ */
|
69
Vinclude/V_hzprof.h
Normal file
69
Vinclude/V_hzprof.h
Normal file
@ -0,0 +1,69 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file vhzprof.h
|
||||
\brief Êðèâàÿ U(f) (ñì. TVhzProf)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup vhzprof Ìîäóëü êðèâîé U(f) (ñì. TVhzProf)
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef VHZPOF_H
|
||||
#define VHZPOF_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \class TVhzProf
|
||||
\brief Êðèâàÿ U(f)
|
||||
|
||||
Êëàññ \a TVhzProf, îñíîâàííûé íà ñòðóêòóðå SVhzProf,
|
||||
ïðåäñòàâëÿåò ñîáîé äâóìåðíóþ çàâèñèìîñòü íàïðÿæåíèÿ U (vout) îò
|
||||
÷àñòîòû f (freq). Ìîäóëü íóæåí ïðè ñêàëÿðíîì óïðàâëåíèè äâèãàòåëåì,
|
||||
áåç êîíòóðîâ òîêà - êîãäà íàïðÿæåíèå ðàñòåò âìåñòå ñ ÷àñòîòîé. Äàííûé ìîäóëü
|
||||
ïîçâîëÿåò íàñòðîèòü ëèíåéíóþ çàâèñèìîñòü íàïðÿæåíèÿ îò ÷àñòîòû ïî äâóì òî÷êàì. */
|
||||
|
||||
//! ñì. TVhzProf
|
||||
struct SVhzProf{ _iq freq;//!< Input: Input frequency (pu)
|
||||
_iq vout;//!< Output: Output voltage (pu)
|
||||
_iq FL;//!< Parameter: Low frequency (pu)
|
||||
_iq FH;//!< Parameter: High frequency at rated voltage (pu)
|
||||
_iq Fmax; //!<Parameter: Maximum frequency (pu)
|
||||
_iq Vmax;//!< Parameter: Rated voltage (pu)
|
||||
_iq Vmin;//!< Parameter: Voltage at low frequency range (pu)
|
||||
void (*calc)(struct SVhzProf*);//!< Pointer to calculation function
|
||||
};
|
||||
|
||||
typedef struct SVhzProf TVhzProf;
|
||||
|
||||
//! Èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define VHZPROF_DEFAULTS { 0,0, \
|
||||
0,0,0,0,0, \
|
||||
vhz_prof_calc }
|
||||
|
||||
//! \memberof TVhzProf
|
||||
void vhz_prof_calc(TVhzProf *v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
68
Vinclude/V_led.h
Normal file
68
Vinclude/V_led.h
Normal file
@ -0,0 +1,68 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file Vled.h
|
||||
\brief Óïðàâëåíèå ñâåòîäèîäàìè
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
#ifndef VINCLUDE_V_LED_H_
|
||||
#define VINCLUDE_V_LED_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include "DSP.h"
|
||||
|
||||
#define LED1 0
|
||||
#define LED2 1
|
||||
#define LED3 2
|
||||
#define LED4 3
|
||||
#define LED5 4
|
||||
#define LED6 5
|
||||
|
||||
#define LED_ALL 6
|
||||
|
||||
struct Sled;
|
||||
typedef volatile struct Sled Tled;
|
||||
|
||||
struct Sled{
|
||||
Uint16 timer1, timer2, timer3, timer4, timer5, timer6;
|
||||
Uint16 mode, prevMode;
|
||||
Uint16 mode3counter;
|
||||
void (*init)(Tled*);
|
||||
void (*toggle)(Tled*, Uint16);
|
||||
void (*on)(Tled*, Uint16);
|
||||
void (*off)(Tled*, Uint16);
|
||||
void (*msCalc)(Tled*);
|
||||
};
|
||||
|
||||
|
||||
|
||||
#define LED_DEFAULTS {0,0,0,0,0,0,0,0,0, LED_init, LED_toggle, LED_on, LED_off, LED_msCalc}
|
||||
void LED_init (Tled*);
|
||||
void LED_toggle (Tled*, Uint16);
|
||||
void LED_on (Tled*, Uint16);
|
||||
void LED_off (Tled*, Uint16);
|
||||
void LED_msCalc (Tled*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* VINCLUDE_V_LED_H_ */
|
108
Vinclude/V_pid_reg3.h
Normal file
108
Vinclude/V_pid_reg3.h
Normal file
@ -0,0 +1,108 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_pid_reg3.h
|
||||
\brief ÏÈÄ-ðåãóëÿòîð (ñì. TPidReg3)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_pid_reg3 ÏÈÄ-ðåãóëÿòîð
|
||||
|
||||
@{*/
|
||||
|
||||
|
||||
|
||||
#ifndef PID_REG3_H
|
||||
#define PID_REG3_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \class TPidReg3
|
||||
\brief Ìîäóëü ÏÈÄ-ðåãóëÿòîðà
|
||||
|
||||
Êëàññ \a TPidReg3, îñíîâàííûé íà ñòðóêòóðå SPidReg3, ïðåäñòàâëÿåò
|
||||
ñîáîé ïðîïîðöèîíàëüíî - èíòåãðàëüíî - äèôôåðåíöèàëüíûé ðåãóëÿòîð.
|
||||
Âñå êîýôôèöèåíòû íàñòðàèâàåìûå, äèôôåðåíöèàëüíàÿ ÷àñòü èìååò íàñòðàèâàåìûé ôèëüòð.
|
||||
|
||||
*/
|
||||
|
||||
//! ñì. TPidReg3
|
||||
typedef struct SPidReg3{ long pid_ref_reg3; //!< Input: Reference input
|
||||
long pid_fdb_reg3;//!< Input: Feedback input
|
||||
long e_reg3;//!<Variable: Error
|
||||
long e_reg3Dz;//!<Variable: Error after dead zone
|
||||
long Kp_reg3;//!< Parameter: Proportional gain
|
||||
long up_reg3;//!< Variable: Proportional output
|
||||
long ui_reg3;//!< Variable: Integral output
|
||||
long ud_reg3;//!< Variable: Derivative output
|
||||
long uprsat_reg3;//!< Variable: Pre-saturated output
|
||||
long saterr_reg3Add;//!< Variable: Äîïîëíèòåëüíàÿ îøèáêà íàñûùåíèÿ îò "âåðõíåãî óðîâíÿ"
|
||||
long pid_out_max;//!< Parameter: Maximum output
|
||||
long pid_out_min;//!< Parameter: Minimum output
|
||||
long pid_out_reg3;//!< Output: PID output */
|
||||
long saterr_reg3;//!< Variable: Saturated difference
|
||||
long Ki_reg3;//!< Parameter: Integral gain
|
||||
long Kc_reg3;//!< Parameter: Integral correction gain
|
||||
long Kd_reg3;//!< Parameter: Derivative gain
|
||||
long up1_reg3;//!< History: Previous proportional output
|
||||
long pid_out_test;//!< Output: PID output for test
|
||||
long DeadZone;//!< Ìåðòâàÿ çîíà
|
||||
long Kf_d;//!<Ôèëüòð äèôôåðåíöèàëüíîé ÷àñòè
|
||||
long e_reg3_filterOut;//!<Âûõîä ôèëüòðà äèôôåðåíöèàëüíîé ÷àñòè
|
||||
long DiffDelim;//!<Äåëèòåëü äëÿ òàêòèðîâàíèÿ ðàñ÷åòà ïðîèçâîäíîé
|
||||
long DiffCounter;//!<Ñ÷åò÷èê äëÿ äåëèòåëÿ
|
||||
int KdFilterInitFlag;//!<Ôëàã ïåðâîãî çàïóñêà äëÿ èíèöèàëèçàöèè ôèëüòðà äèôô. ÷àñòè
|
||||
void (*calc)(struct SPidReg3*);//!< Pointer to calculation function
|
||||
void (*reset)(struct SPidReg3*);//!< Pointer to reset function
|
||||
}TPidReg3;
|
||||
|
||||
|
||||
//! Èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define PIDREG3_DEFAULTS { 0,0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0,0, \
|
||||
_IQ(1), \
|
||||
_IQ(-1), \
|
||||
0, \
|
||||
0, \
|
||||
_IQ(0.05), \
|
||||
_IQ(0.5), \
|
||||
_IQ(0), \
|
||||
0,0,0,0,0,0,0,0,\
|
||||
pid_reg3_calc,\
|
||||
pid_reg3_reset}
|
||||
|
||||
|
||||
|
||||
//! \memberof TPidReg3
|
||||
void pid_reg3_calc(TPidReg3*);
|
||||
void pid_reg3_reset(TPidReg3*);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
108
Vinclude/V_pid_reg3_pos.h
Normal file
108
Vinclude/V_pid_reg3_pos.h
Normal file
@ -0,0 +1,108 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_pid_reg3.h
|
||||
\brief ÏÈÄ-ðåãóëÿòîð (ñì. TPidReg3)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_pid_reg3 ÏÈÄ-ðåãóëÿòîð
|
||||
|
||||
@{*/
|
||||
|
||||
|
||||
|
||||
#ifndef PID_REG3_POS_H
|
||||
#define PID_REG3_POS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \class TPidReg3
|
||||
\brief Ìîäóëü ÏÈÄ-ðåãóëÿòîðà
|
||||
|
||||
Êëàññ \a TPidReg3, îñíîâàííûé íà ñòðóêòóðå SPidReg3, ïðåäñòàâëÿåò
|
||||
ñîáîé ïðîïîðöèîíàëüíî - èíòåãðàëüíî - äèôôåðåíöèàëüíûé ðåãóëÿòîð.
|
||||
Âñå êîýôôèöèåíòû íàñòðàèâàåìûå, äèôôåðåíöèàëüíàÿ ÷àñòü èìååò íàñòðàèâàåìûé ôèëüòð.
|
||||
|
||||
*/
|
||||
|
||||
//! ñì. TPidReg3
|
||||
typedef struct SPidReg3_pos{ long pid_ref_reg3; //!< Input: Reference input
|
||||
long pid_fdb_reg3;//!< Input: Feedback input
|
||||
long e_reg3;//!<Variable: Error
|
||||
long e_reg3Dz;//!<Variable: Error after dead zone
|
||||
long Kp_reg3;//!< Parameter: Proportional gain
|
||||
long up_reg3;//!< Variable: Proportional output
|
||||
long ui_reg3;//!< Variable: Integral output
|
||||
long ud_reg3;//!< Variable: Derivative output
|
||||
long uprsat_reg3;//!< Variable: Pre-saturated output
|
||||
long saterr_reg3Add;//!< Variable: Äîïîëíèòåëüíàÿ îøèáêà íàñûùåíèÿ îò "âåðõíåãî óðîâíÿ"
|
||||
long pid_out_max;//!< Parameter: Maximum output
|
||||
long pid_out_min;//!< Parameter: Minimum output
|
||||
long pid_out_reg3;//!< Output: PID output */
|
||||
long saterr_reg3;//!< Variable: Saturated difference
|
||||
long Ki_reg3;//!< Parameter: Integral gain
|
||||
long Kc_reg3;//!< Parameter: Integral correction gain
|
||||
long Kd_reg3;//!< Parameter: Derivative gain
|
||||
long up1_reg3;//!< History: Previous proportional output
|
||||
long pid_out_test;//!< Output: PID output for test
|
||||
long DeadZone;//!< Ìåðòâàÿ çîíà
|
||||
long Kf_d;//!<Ôèëüòð äèôôåðåíöèàëüíîé ÷àñòè
|
||||
long e_reg3_filterOut;//!<Âûõîä ôèëüòðà äèôôåðåíöèàëüíîé ÷àñòè
|
||||
long DiffDelim;//!<Äåëèòåëü äëÿ òàêòèðîâàíèÿ ðàñ÷åòà ïðîèçâîäíîé
|
||||
long DiffCounter;//!<Ñ÷åò÷èê äëÿ äåëèòåëÿ
|
||||
int KdFilterInitFlag;//!<Ôëàã ïåðâîãî çàïóñêà äëÿ èíèöèàëèçàöèè ôèëüòðà äèôô. ÷àñòè
|
||||
void (*calc)(struct SPidReg3_pos*);//!< Pointer to calculation function
|
||||
void (*reset)(struct SPidReg3_pos*);//!< Pointer to reset function
|
||||
}TPidReg3_pos;
|
||||
|
||||
|
||||
//! Èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define PIDREG3_DEFAULTS_POS { 0,0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0,0, \
|
||||
_IQ(1), \
|
||||
_IQ(-1), \
|
||||
0, \
|
||||
0, \
|
||||
_IQ(0.05), \
|
||||
_IQ(0.5), \
|
||||
_IQ(0), \
|
||||
0,0,0,0,0,0,0,0,\
|
||||
pid_reg3_calc_pos,\
|
||||
pid_reg3_reset_pos}
|
||||
|
||||
|
||||
|
||||
//! \memberof TPidReg3
|
||||
void pid_reg3_calc_pos(TPidReg3_pos*);
|
||||
void pid_reg3_reset_pos(TPidReg3_pos*);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
67
Vinclude/V_relay_reg.h
Normal file
67
Vinclude/V_relay_reg.h
Normal file
@ -0,0 +1,67 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_relay_reg.h
|
||||
\brief Ðåëåéíûé ðåãóëÿòîð
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.0 23/01/2016
|
||||
|
||||
\defgroup V_realy_reg
|
||||
|
||||
@{*/
|
||||
|
||||
|
||||
|
||||
#ifndef V_RELAY_REG_H
|
||||
#define V_RELAY_REG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \class TRelayReg
|
||||
\brief Ìîäóëü ðåëåéíîãî ðåãóëÿòîðà
|
||||
|
||||
Êëàññ \a TRelayReg, îñíîâàííûé íà ñòðóêòóðå SRelayReg, ïðåäñòàâëÿåò
|
||||
ñîáîé ðåëåéíûé ðåãóëÿòîð.
|
||||
|
||||
*/
|
||||
|
||||
//! ñì. TRelayReg
|
||||
typedef struct SRelayReg{ long ref; //!< Çàäàíèå
|
||||
long fdb;//!< Îáðàòíàÿ ñâÿçü
|
||||
long out;//!< Âûõîä
|
||||
void (*calc)(struct SRelayReg*);//!< Pointer to calculation function
|
||||
}TRelayReg;
|
||||
|
||||
|
||||
//! Èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define RELAY_REG_DEFAULTS { 0,0,0, \
|
||||
relay_reg_calc}
|
||||
|
||||
|
||||
|
||||
//! \memberof TRelayReg
|
||||
void relay_reg_calc(TRelayReg*);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
74
Vinclude/V_rmp_ctrl.h
Normal file
74
Vinclude/V_rmp_ctrl.h
Normal file
@ -0,0 +1,74 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_rmp_ctrl.h
|
||||
\brief Çàäàò÷èê èíòåíñèâíîñòè (ñì. TRMPCtrl)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup V_rmp_ctrl Çàäàò÷èê èíòåíñèâíîñòè (ñì. TRMPCtrl)
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef V_RMP_CTRL_H
|
||||
#define V_RMP_CTRL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \class TRMPCtrl
|
||||
\brief Çàäàò÷èê èíòåíñèâíîñòè
|
||||
|
||||
Êëàññ \a TRMPCtrl, îñíîâàííûé íà ñòðóêòóðå SRMPCtrl, ïðåäñòàâëÿåò
|
||||
ñîáîé çàäàò÷èê èíòåíñèâíîñòè - ìîäóëü, ëèíåéíî ñ çàäàííûì òåìïîì
|
||||
èçìåíÿþùèé ñâîé âûõîä, ïîêà îí íå ñðàâíÿåòñÿ ñî âõîäîì. ×àùå âñåãî ñëóæèò
|
||||
äëÿ ïëàâíîãî ðàçãîíà äâèãàòåëÿ ïðè èçìåíåíèè çàäàíèÿ ñêà÷êîì.*/
|
||||
|
||||
//! ñì. TRMPCtrl
|
||||
struct SRMPCtrl{ long input;//!< Âõîä
|
||||
long output;//!< Âûõîä
|
||||
long Ts;//!< ×àñòîòà äèñêðåòèçàöèè
|
||||
unsigned long T;//!< Òåìï ðàçãîíà (âðåìÿ â ñåêóíäàõ äî èçìåíåíèÿ âûõîäà îò íóëÿ äî åäèíèöû)
|
||||
long step;//!<Ñëóæåáíàÿ ïåðåìåííàÿ
|
||||
void (*calc)(struct SRMPCtrl*); //!< Ôóíêöèÿ ðàñ÷åòà, äîëæíà âûçûâàòüñÿ ñ çàäàííîé â Ts äèñêðåòíîñòüþ
|
||||
void (*slow_calc)(struct SRMPCtrl*); //!< Ôóíêöèÿ ïåðåñ÷åòà êîýôôèöèåíòîâ
|
||||
};
|
||||
|
||||
typedef struct SRMPCtrl TRMPCtrl;
|
||||
|
||||
//!Èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define V_RMP_CTRL_DEFAULTS {0, \
|
||||
0, \
|
||||
_IQ(0.0001), \
|
||||
_IQ(20), \
|
||||
0,\
|
||||
V_RMP_CTRL_calc,\
|
||||
V_RMP_CTRL_slow_calc,\
|
||||
}
|
||||
|
||||
//! \memberof TRMPCtrl
|
||||
void V_RMP_CTRL_calc(TRMPCtrl*);
|
||||
//! \memberof TRMPCtrl
|
||||
void V_RMP_CTRL_slow_calc(TRMPCtrl*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
61
Vinclude/V_rotor_observer.h
Normal file
61
Vinclude/V_rotor_observer.h
Normal file
@ -0,0 +1,61 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file v_rotor_observer.h
|
||||
\brief Íàáëþäàòåëü ðîòîðà ÀÄ (ñì. TRotorObserver)
|
||||
\author ÎÎÎ ÍÏÔ Âåêòîð
|
||||
\version v 1.0 28/06/2016
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/** \addtogroup TRotorObserver */
|
||||
/*@{*/
|
||||
|
||||
|
||||
#ifndef ROTOR_OBSERVER_H
|
||||
#define ROTOR_OBSERVER_H
|
||||
|
||||
struct SRotorObserver{
|
||||
_iq Ks;
|
||||
_iq id;
|
||||
_iq iq;
|
||||
_iq psi_d;
|
||||
_iq psi_q;
|
||||
_iq theta_psi_elec; //!< Óãîë ïîòîêîñöåïëåíèÿ ðîòîðà îòíîñèòåëüíî ÄÏÐ
|
||||
_iq Tr; //!< Ïîñòîÿííàÿ âðåìåíè ÀÄ
|
||||
_iq FluxCurrentRatio; //!< Ñîîòíîøåíèå òîêà âîçáóæäåíèÿ îñè x ê ìîìåíòîîáðàçóþùåìó òîêó îñè y
|
||||
_iq FluxCurrentMin; //!< Ìèíèìóì òîêà âîçáóæäåíèÿ
|
||||
void (*calc)(struct SRotorObserver*);
|
||||
void (*slow_calc)(struct SRotorObserver*);
|
||||
};
|
||||
|
||||
typedef struct SRotorObserver TRotorObserver;
|
||||
|
||||
#define ROTOR_OBSERVER_DEFAULTS {\
|
||||
0,0,\
|
||||
0,0,0,0,\
|
||||
0,0,0,\
|
||||
RotorObserver_calc,\
|
||||
RotorObserver_slow_calc,\
|
||||
}
|
||||
|
||||
void RotorObserver_calc(TRotorObserver *);
|
||||
void RotorObserver_slow_calc(TRotorObserver *p);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
35
Vinclude/V_usblib.h
Normal file
35
Vinclude/V_usblib.h
Normal file
@ -0,0 +1,35 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_usblib.c
|
||||
\brief Íàáîð ôóíêöèé äëÿ èíèöèàëèçàöèè äðàéâåðà USB. Îñíîâàí íà ïðèìåðå
|
||||
USB VCP" îò ÍÈÈÝÒ:
|
||||
https://bitbucket.org/niietcm4/
|
||||
---> / chip / K1921VK01T / GCC / USB / CDC_VCP /
|
||||
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru, ÍÈÈÝÒ http://niiet.ru
|
||||
\version v 1.0 08/08/2017
|
||||
|
||||
*/
|
||||
|
||||
#ifndef VINCLUDE_V_USBLIB_H_
|
||||
#define VINCLUDE_V_USBLIB_H_
|
||||
|
||||
int USB_init_hardware(void);
|
||||
void USB_enable_peripheral (void);
|
||||
void SystemInit (void);
|
||||
|
||||
extern Uint8 usbActiveFlag;
|
||||
#endif /* VINCLUDE_V_USBLIB_H_ */
|
32
Vinclude/V_watchdog.h
Normal file
32
Vinclude/V_watchdog.h
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* V_watchdog.h
|
||||
*
|
||||
* Created on: 12 èþë. 2018 ã.
|
||||
* Author: Dmitry
|
||||
*/
|
||||
|
||||
#ifndef V_WATCHDOG_H_
|
||||
#define V_WATCHDOG_H_
|
||||
|
||||
struct Swdog;
|
||||
typedef volatile struct Swdog Twdog;
|
||||
|
||||
struct Swdog {
|
||||
void (*enable)();
|
||||
void (*disable)();
|
||||
void (*feed)();
|
||||
void (*resetCPU)();
|
||||
};
|
||||
|
||||
void WDog_Enable();
|
||||
void WDog_Disable();
|
||||
void WDog_Feed();
|
||||
void WDog_ResetSystem();
|
||||
|
||||
#define WDOG_DEFAULTS {.enable = WDog_Enable,\
|
||||
.disable = WDog_Disable,\
|
||||
.feed = WDog_Feed,\
|
||||
.resetCPU = WDog_ResetSystem}
|
||||
|
||||
extern Twdog Watchdog;
|
||||
#endif /* V_WATCHDOG_H_ */
|
51
Vinclude/X_CANFlashProgData.h
Normal file
51
Vinclude/X_CANFlashProgData.h
Normal file
@ -0,0 +1,51 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file X_CANFlashProgData.h
|
||||
\brief Áèíàðíûé ôàéë ïðîøèâàëüùèêà - ãðóçèòñÿ â ÎÇÓ è åìó ïåðåäàåòñÿ óïðàâëåíèå, äàëåå ïî CANopen ìîæíî îáíîâèòü ïðîãðàììó ïî flash.
|
||||
\author Àëÿìêèí Ä.
|
||||
\version v 1.0 30/05/2017
|
||||
|
||||
\defgroup X_CANFlashProgData */
|
||||
/*@{*/
|
||||
|
||||
|
||||
|
||||
#ifndef X_CANFLASHPROGDATA_H
|
||||
#define X_CANFLASHPROGDATA_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
//àäðåñ ñòðóêòóðû íàñòðîåê
|
||||
extern Uint32 const FPSettingsAddr;
|
||||
//àäðåñ íà÷àëà ïðîãðàììû ïðîøèâàëüùèêà
|
||||
extern Uint32 const FPStartAddr;
|
||||
//êîëè÷åñòâî àäðåñîâ â ìàññèâå FPAddrs
|
||||
extern Uint16 const FPNumOfAddrs;
|
||||
//àäðåñà íà÷àëà ÷àñòåé ïðîøèâàëüùèêà
|
||||
extern Uint32 const FPAddrs[];
|
||||
//äëèíà ÷àñòåé ïðîøèâàëüùèêà
|
||||
extern Uint16 const FPPartsLength[];
|
||||
//äàííûå ïðîøèâàëüùèêà
|
||||
extern Uint16 const FPData[];
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
82
Vinclude/X_CANFlashProgStarter.h
Normal file
82
Vinclude/X_CANFlashProgStarter.h
Normal file
@ -0,0 +1,82 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file X_CANFlashProgStarter.h
|
||||
\brief Èíèöèàëèçèðóåò ïðîöåññ ïðîæèãà ïî CANó
|
||||
\author Àëÿìêèí Ä.
|
||||
\version v 1.0 30/05/2017
|
||||
|
||||
\defgroup TCANFlashProgStarter */
|
||||
/*@{*/
|
||||
|
||||
|
||||
|
||||
#ifndef X_CANFLASHPROGSTARTER_H
|
||||
#define X_CANFLASHPROGSTARTER_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
//#define FP_DEVICE_2810
|
||||
//#define FP_DEVICE_28335
|
||||
//#define FP_DEVICE_28035
|
||||
//#define FP_DEVICE_28069
|
||||
#define FP_DEVICE_M4F
|
||||
|
||||
//Ïåðåîïðåäåëßåìûå ïîëüçîâàòåëåì ìàêðîñû
|
||||
#define FP_BLOCK_PWM pwm.Off(&pwm); //âûêëþ÷åíèå ØÈÌ
|
||||
#define FP_CTRL_STOP sm_ctrl.state=CTRL_STOP
|
||||
#define FP_FAULT_SET sm_prot.bit_fault2|= F_FLASH_PROGRAM
|
||||
|
||||
|
||||
struct SFlashProgSettings{
|
||||
Uint16 magic_number;
|
||||
Uint16 CANa_nodeID; //2000.0 íîìåð äàííîãî óçëà
|
||||
Uint16 CANa_bitRate; //2001.0
|
||||
Uint16 CANa_enable;
|
||||
Uint16 CANb_nodeID; //2000.0 íîìåð äàííîãî óçëà
|
||||
Uint16 CANb_bitRate; //2001.0
|
||||
Uint16 CANb_enable;
|
||||
};
|
||||
typedef volatile struct SFlashProgSettings TFlashProgSettings;
|
||||
|
||||
extern TFlashProgSettings FPsettings;
|
||||
|
||||
/*
|
||||
struct SFlashProgStarter
|
||||
{
|
||||
Uint16 input;
|
||||
void(*start)(volatile struct SFlashProgStarter*);
|
||||
};
|
||||
|
||||
typedef volatile struct SFlashProgStarter TFlashProgStarter;
|
||||
|
||||
#define TFLASHPROGSTARTER_DEFAULTS {0,\
|
||||
StartFlashProgrammer,\
|
||||
}
|
||||
*/
|
||||
void StartFlashProgrammer();
|
||||
extern long swu_vars;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
117
Vinclude/build.h
Normal file
117
Vinclude/build.h
Normal file
@ -0,0 +1,117 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file build.h
|
||||
\brief Êîíôèãóðàöèîííûé çàãîëîâî÷íûé ôàéë
|
||||
Ñîäåðæèò ãëîáàëüíûå ìàêðîîïðåäåëåíèÿ, èñïîëüçóåìûå âî âñåì ïðîåêòå.
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 3.0 30/05/2017
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
// Ðàçðåøèòü ñòîðîæåâîé òàéìåð
|
||||
//#define WATCHDOG_ON
|
||||
//Âûáîð òèïà àïïàðàòíîé ÷àñòè
|
||||
|
||||
//Äëÿ UART, âûáèðàåòñÿ ÷åì åãî çàíÿòü - MODBUS èëè CANtoRS äðàéâåðîì
|
||||
//#define MODBUS_ENA
|
||||
#define CANTORS_ENA
|
||||
|
||||
// Òàêæå ìîæíî çàäåéñòâîâàòü USB äëÿ CANopen
|
||||
#define CANTOUSB_ENA
|
||||
|
||||
//!Ðåæèìû ðàáîòû (ñîñòîÿíèÿ ÄÀ sm_ctrl)
|
||||
//! Ðåæèì îñòàíîâ
|
||||
#define CTRL_STOP 0
|
||||
//! Ðåæèì çàïóñêà (âêëþ÷åíèå ØÈÌ, ïåðåõîä â äðóãîé æåëàåìûé ðåæèì ðàáîòû)
|
||||
#define CTRL_RUN 1
|
||||
//! Ðåæèì íàìàãíè÷èâàíèå (ïîñòîÿííûé òîê), ðàáîòàåò êîíòóð òîêà
|
||||
#define CTRL_FLUXING 2
|
||||
//! Ðåæèì ñêàëÿðíîãî óïðàâëåíèÿ ïî êðèâîé U(f) áåç êîíòóðîâ òîêà
|
||||
#define CTRL_RUN_U2F 3
|
||||
//! Ðåæèì âðàùåíèÿ âåêòîðà òîêà
|
||||
#define CTRL_RUN_I2F 4
|
||||
//! Âåêòîðíàÿ ñòðóêòóðà óïðàâëåíèÿ äâóõêîíòóðíàÿ ñ äàò÷èêîì äëÿ ñèíõðîííîé ìàøèíû
|
||||
#define CTRL_RUN_VECTOR_SM 5
|
||||
//! Âåêòîðíàÿ ñòðóêòóðà óïðàâëåíèÿ ñ ýíêîäåðîì è ñ êîíòóðîì ïîëîæåíèÿ äëÿ ñèíõðîííîé ìàøèíû
|
||||
#define CTRL_RUN_VECTOR_SM_ENCODER_POS 10
|
||||
|
||||
//! Âåêòîðíîå óïðàâëåíèå äëÿ àñèíõðîííîãî äâèãàòåëÿ ñ ýíêîäåðîì.
|
||||
#define CTRL_RUN_VECTOR_IM_ENCODER 55
|
||||
|
||||
//! Ðåæèì êàëèáðîâêè äàò÷èêà ïîëîæåíèÿ
|
||||
#define CTRL_AUTO_SENSOR_TUNING 29
|
||||
|
||||
//! Ðåæèì àâòîêîììóòàöèè äëÿ SRM
|
||||
#define CTRL_RUN_SRM_AUTOCOMMUTATION 101
|
||||
|
||||
//! Ðåæèì èçìåðåíèÿ çàäåðæêè ìåæäó ØÈÌ è äàò÷èêàìè òîêà
|
||||
#define CTRL_RUN_LATENCY_TEST 31
|
||||
|
||||
|
||||
|
||||
|
||||
//Ôëàãè àâàðèé äëÿ ìîäóëÿ çàùèò
|
||||
|
||||
//bit_fault1
|
||||
#define F_CTRL_LOW_UDC 0x1
|
||||
#define F_CTRL_HI_UDC 0x2
|
||||
#define F_ENCODER_FAULT 0x4
|
||||
#define F_MODEL_FAULT 0x8
|
||||
#define F_FLASH_PROGRAM 0x10
|
||||
//#define F_RESERVED 0x20
|
||||
//#define F_RESERVED 0x40
|
||||
//#define F_RESERVED 0x80
|
||||
#define F_PROGRAM_1K 0x100
|
||||
#define F_PROGRAM_10K 0x200
|
||||
#define F_PROGRAM_40K 0x400
|
||||
//#define F_RESERVED 0x800
|
||||
#define F_PDPINT 0x1000
|
||||
//#define F_RESERVED 0x2000
|
||||
//#define F_RESERVED 0x4000
|
||||
//#define F_RESERVED 0x8000
|
||||
|
||||
//bit_fault2
|
||||
//#define F_RESERVED 0x1
|
||||
//#define F_RESERVED 0x2
|
||||
//#define F_RESERVED 0x4
|
||||
//#define F_RESERVED 0x8
|
||||
#define F_CTRL_MAX_I_PH_A 0x10
|
||||
#define F_CTRL_MAX_I_PH_B 0x20
|
||||
#define F_CTRL_MAX_I_PH_C 0x40
|
||||
//#define F_RESERVED 0x80
|
||||
//#define F_RESERVED 0x100
|
||||
#define F_CTRL_SPEED_MAX 0x200
|
||||
//#define F_RESERVED 0x400
|
||||
//#define F_RESERVED 0x800
|
||||
//#define F_RESERVED 0x1000
|
||||
//#define F_RESERVED 0x2000
|
||||
//#define F_RESERVED 0x4000
|
||||
//#define F_RESERVED 0x8000
|
||||
|
||||
|
||||
#define POS_SENSOR_TYPE_NO_SENSOR 0
|
||||
#define POS_SENSOR_TYPE_ENCODER 1
|
||||
#define POS_SENSOR_TYPE_HALL 2
|
||||
#define POS_SENSOR_TYPE_ENC_HALL 3
|
||||
#define POS_SENSOR_TYPE_SSI 4
|
||||
#define POS_SENSOR_TYPE_SENSORLESS 5
|
||||
|
||||
//!Âðåìÿ äèñêðåòèçàöèè áûñòðîãî ðàñ÷åòà (ïðåðûâàíèå, êîòîðîå îáû÷íî 10êÃö)
|
||||
#define FAST_CALC_TS _IQ(0.0001)
|
||||
|
||||
|
||||
/*@}*/
|
71
Vinclude/clarke.h
Normal file
71
Vinclude/clarke.h
Normal file
@ -0,0 +1,71 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file clarke.h
|
||||
\brief Ìîäóëü ôàçíûõ ïðåîáðàçîâàíèé (ñì. TClarke)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup clarke Ìîäóëü ôàçíûõ ïðåîáðàçîâàíèé (ñì. Tclarke)
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef CLARKE_H
|
||||
#define CLARKE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*! \class TClarke
|
||||
\brief Ôàçíûå ïðåîáðàçîâàíèÿ
|
||||
|
||||
Êëàññ \a TClarke, îñíîâàííûé íà ñòðóêòóðå SClarke, îáåñïå÷èâàåò
|
||||
ïðåîáðàçîâàíèå âåëè÷èíû èç òðåôàçíîé ñèñòåìû êîîðäèíàò â äâóõôàçíóþ.
|
||||
Òàê, äëÿ ïðåîáðàçîâàíèÿ òîêîâ ôàç âõîäíûì ïåðåìåííûì as è bs íåîáõîäèìî
|
||||
ïðèñâîèòü çíà÷åíèå òîêîâ ôàç A è B, âûçâàòü ôóíêöèþ calc, ïîñëå ÷åãî â âûõîäíûõ
|
||||
ïåðåìåííûõ ds, qs áóäåò çíà÷åíèå âåêòîðà òîêà âî âçàèìíî ïåðïåíäèêóëÿðíûõ îñÿõ
|
||||
àëüôà, áåòòà (â àíãëîÿçû÷íîé ëèòåðàòóðå îñè d,q).*/
|
||||
|
||||
//! ñì. TClarke
|
||||
struct SClarke{ long as; //!< Input: phase-a stator variable
|
||||
long bs;//!< Input: phase-b stator variable
|
||||
long ds; //!< Output: stationary d-axis stator variable
|
||||
long qs; //!< Output: stationary q-axis stator variable
|
||||
void (*calc)(struct SClarke*); //!< Pointer to calculation function
|
||||
};
|
||||
|
||||
typedef struct SClarke TClarke;
|
||||
|
||||
//! èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define CLARKE_DEFAULTS { 0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
clarke_calc }
|
||||
|
||||
//! \memberof TClarke
|
||||
void clarke_calc(TClarke*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
867
Vinclude/co_ODvars.h
Normal file
867
Vinclude/co_ODvars.h
Normal file
@ -0,0 +1,867 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file co_ODvars.h
|
||||
\brief Объявляет некоторые служебные структуры для драйвера CANOpen
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.3 28/06/2019
|
||||
|
||||
\defgroup CANOpen_drv Драйвер CANOpen
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef CO_OD_VARS_H
|
||||
#define CO_OD_VARS_H
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "DSP.h"
|
||||
|
||||
//****************************************************************************************************************************************
|
||||
//! Начальный адрес для сохранения в SPI памяти словаря 1-го CAN
|
||||
#define CO1_SPI_START_ADDR 0
|
||||
//! Начальный адрес для сохранения в SPI памяти словаря 2-го CAN
|
||||
#define CO2_SPI_START_ADDR 3500
|
||||
|
||||
|
||||
// количество "замеппированных" объектов для каждого PDO
|
||||
#define RPDO1NUMOFPARAMS 4
|
||||
#define RPDO2NUMOFPARAMS 4
|
||||
#define RPDO3NUMOFPARAMS 4
|
||||
#define RPDO4NUMOFPARAMS 4
|
||||
#define RPDO5NUMOFPARAMS 4
|
||||
#define RPDO6NUMOFPARAMS 4
|
||||
#define RPDO7NUMOFPARAMS 4
|
||||
#define RPDO8NUMOFPARAMS 4
|
||||
|
||||
#define TPDO1NUMOFPARAMS 4
|
||||
#define TPDO2NUMOFPARAMS 4
|
||||
#define TPDO3NUMOFPARAMS 4
|
||||
#define TPDO4NUMOFPARAMS 4
|
||||
#define TPDO5NUMOFPARAMS 4
|
||||
#define TPDO6NUMOFPARAMS 4
|
||||
#define TPDO7NUMOFPARAMS 4
|
||||
#define TPDO8NUMOFPARAMS 4
|
||||
|
||||
|
||||
|
||||
//структура с таблицами параметров для настройки скорости CAN (для каждого микроконтроллера настройки свои)
|
||||
typedef struct {
|
||||
Uint16 co_DIV8[6];
|
||||
Uint16 co_BRP[6];
|
||||
Uint16 co_TSEG1[6];
|
||||
Uint16 co_TSEG2[6];
|
||||
Uint16 co_SJW[6];
|
||||
} TCANSpeedTableOptions;
|
||||
|
||||
//структура пользовательских настроек драйвера
|
||||
struct S_CANOPEN_DRV_SETTINGS
|
||||
{
|
||||
Uint16 LoadParamsFromUserMemory_ena; //Загружать параметры из пользовательской памяти при инициализации
|
||||
Uint16 CAN_ISR_priority; //Приоритет прерываний CAN
|
||||
|
||||
Uint16 MultiPDO_ena; /* //разрешение принимать PDO от любых устройств в сети:
|
||||
//для каждого RPDO доступны 8 диапазонов принимаемых идентификаторов:
|
||||
// 0x181-0x1FF
|
||||
// 0x200-0x27F
|
||||
// 0x280-0x2FF
|
||||
// ...
|
||||
// 0x480-0x4FF
|
||||
// 0x500-0x57F
|
||||
//Каждому RPDO должен быть сопоставлен свой диапазон идентификаторов.
|
||||
//Для сопоставления данному RPDO диапазона идентификаторов необходимо присвоить
|
||||
//соответствующему RPDOxCOBID любой идентификатор требуемого диапазона.
|
||||
//Двум RPDO одного устройства не может быть сопоставлен один и тот же диапазон идентификаторов -
|
||||
//в этом случае поведение непредсказуемо. */
|
||||
|
||||
Uint16 RX_PDO_Callback_ena; /*//разрешение вызова CallBack при приеме PDO. (может использоваться как в обычном режиме, так и в режиме МультиPDO).
|
||||
//Если дефайн объявлен, то после каждого приема узлом PDO будет вызываться соответствующая CallBack функция
|
||||
//(ф-ии описаны в файле CANOpenCallbacks.c) вида: void co_RPDOx_Callback(Uint16 nodeID)
|
||||
//Где x = 1,2,..8 при приеме RPDO1, RPDO2,..RPDO8 соответственно.
|
||||
//В качестве параметра в функцию передается только номер узла (nodeID) от которого принято PDO,
|
||||
//а принятая информация находится по соответствующему(-им) мэппингу данного PDO адресу(-ам).*/
|
||||
|
||||
Uint16 AutoBusON_ena; /*//разрешение CAN устройству оставаться в работе даже при наличии большого количества ошибок на линии CAN.
|
||||
//С одной стороны разрешение позволяет работать устройству в сильно зашумленной линии, но с другой -
|
||||
//при отказе в устройстве, например rx, устройство забьет всю сеть, пытаясь отправить свою посылку...*/
|
||||
|
||||
Uint16 BlockTransfer_ena; //разрешение использования в драйвере функций блочной передачи
|
||||
|
||||
Uint32 BaseAdressCanRegisters; //адрес в памяти, с которого начинаются CAN-регистры. Нужно для унификация библиотеки драйвера CANOpen для разных
|
||||
//микроконтроллеров фирмы НИИЭТ
|
||||
|
||||
Uint16 CAN_IRQn; //номер перечисления прерывания CAN из таблицы прерываний. Нужно для унификация библиотеки драйвера CANOpen для
|
||||
//разных микроконтроллеров фирмы НИИЭТ
|
||||
|
||||
TCANSpeedTableOptions *speedCANTablePointer;//указатель на массив структур с таблицами параметров для настройки скорости CAN для разных микроконтроллеров.
|
||||
|
||||
void (*resetCPU)(void); //указатель на функцию перезагрузки микроконтроллера. Нужна, потому как для разных микроконтроллеров фирмы НИИЭТ
|
||||
//используются разные функции для ресета.
|
||||
};
|
||||
|
||||
// Тип доступа к параметру (согласно формату)
|
||||
typedef enum EObjAccess
|
||||
{
|
||||
OBJ_ACCESS_READONLY, // read-only
|
||||
OBJ_ACCESS_RW, // read/write
|
||||
OBJ_ACCESS_WP, // read/writeable protected
|
||||
OBJ_ACCESS_SWP, // read/secret writeable protected
|
||||
} TObjAccess;
|
||||
|
||||
// Тип параметра (согласно формату)
|
||||
typedef enum EObjType
|
||||
{
|
||||
OBJ_TYPE_UNKNOWN,
|
||||
OBJ_TYPE_ROOT,
|
||||
OBJ_TYPE_U8,
|
||||
OBJ_TYPE_U16,
|
||||
OBJ_TYPE_QU16,
|
||||
OBJ_TYPE_I8,
|
||||
OBJ_TYPE_I16,
|
||||
OBJ_TYPE_QI16,
|
||||
OBJ_TYPE_U32,
|
||||
OBJ_TYPE_QU32,
|
||||
OBJ_TYPE_I32,
|
||||
OBJ_TYPE_QI32,
|
||||
OBJ_TYPE_BIT_FIELD,
|
||||
OBJ_TYPE_FLOAT_ABS,
|
||||
OBJ_TYPE_FLOAT_PU,
|
||||
} TObjType;
|
||||
|
||||
// Структура, содержащая различную информацию об объекте.
|
||||
typedef struct
|
||||
{
|
||||
void* varAddr; // адрес переменной в ОЗУ
|
||||
int varSize; // размер переменной в битах (16/32)
|
||||
TObjAccess access; // тип доступа к объекту
|
||||
TObjType type; // тип объекта
|
||||
Uint16 subIndNum; // число подындексов (для ROOT)
|
||||
Uint16 scaleNum; // номер масштабирующего коэффициента (для QU16, QI16, QU32, QI32, FLOAT_PU)
|
||||
Uint16 Q; // число разрядов дробной части (для QU16, QI16, QU32, QI32)
|
||||
Uint16 bitOffset; // смещение битового поля (для BIT_FIELD)
|
||||
Uint16 bitNum; // размер битового поля (для BIT_FIELD)
|
||||
Uint16 precision; // число знаков, отображаемых после запятой (для FLOAT_ABS)
|
||||
Uint16 prefix; // префикс размерности (для FLOAT_ABS)
|
||||
Uint16 units; // размерность (для FLOAT_ABS)
|
||||
} TObjectInfo;
|
||||
|
||||
|
||||
typedef volatile struct S_CANOPEN_DRV_SETTINGS T_CANOPEN_DRV_SETTINGS;
|
||||
|
||||
//!Конфигурирование полей SDO
|
||||
struct SDOcommSpecifier {
|
||||
Uint16 s:1; //!< 0 - если s=1, то размер передаваемых данных известен и указан
|
||||
Uint16 e:1; //!< 1 - expedited или нет
|
||||
Uint16 n:2; //!< 3:2 - количество байт данных не содержащих данных
|
||||
Uint16 X:1; //!< 4 - reserved
|
||||
Uint16 cs:3;//!< 7:5 - SDO команда
|
||||
Uint16 reserved:8;//
|
||||
};
|
||||
|
||||
//! Нулевой байт мейл-бокса
|
||||
union MBOXByte0{
|
||||
struct SDOcommSpecifier SDO_Spicifier;
|
||||
Uint16 byte0;
|
||||
};
|
||||
//! Байты мейл-бокса, используемого для альтернативной CAN связи (ZigBee, USB)
|
||||
typedef struct {
|
||||
union MBOXByte0 MByte0;
|
||||
Uint16 byte1;
|
||||
Uint16 byte2;
|
||||
Uint16 byte3;
|
||||
Uint16 byte4;
|
||||
Uint16 byte5;
|
||||
Uint16 byte6;
|
||||
Uint16 byte7;
|
||||
Uint16 senderNodeID;
|
||||
}Z_MBytes;
|
||||
|
||||
typedef struct {
|
||||
Uint32 id;
|
||||
Uint8 data[8];
|
||||
Uint8 dlc;
|
||||
} TZCanMsg;
|
||||
|
||||
|
||||
///сообщение в виде полей SDO
|
||||
struct SDOmsg
|
||||
{ Uint32 s:1; //!< 0 - если s=1, то размер передаваемых данных известен и указан
|
||||
Uint32 e:1; //!< 1 - expedited или нет
|
||||
Uint32 n:2; //!< 3:2 - количество байт данных не содержащих данных
|
||||
Uint32 X:1; //!< 4 - reserved
|
||||
Uint32 cs:3;//!< 7:5 - SDO команда
|
||||
Uint32 index:16;
|
||||
Uint32 subindex:8;
|
||||
Uint32 data:32;
|
||||
};
|
||||
//сообщение в виде байтов
|
||||
struct MBOX_bytes
|
||||
{ Uint16 byte0:8;
|
||||
Uint16 byte1:8;
|
||||
Uint16 byte2:8;
|
||||
Uint16 byte3:8;
|
||||
Uint16 byte4:8;
|
||||
Uint16 byte5:8;
|
||||
Uint16 byte6:8;
|
||||
Uint16 byte7:8;
|
||||
};
|
||||
//сообщение в виде слов
|
||||
struct MBOX_words
|
||||
{ Uint16 word0;
|
||||
Uint16 word1;
|
||||
Uint16 word2;
|
||||
Uint16 word3;
|
||||
};
|
||||
//сообщение в виде MDRL, MDRH
|
||||
struct MBOX_Uint32
|
||||
{ Uint32 MDRL;
|
||||
Uint32 MDRH;
|
||||
};
|
||||
//все представления накладываем друг на друга
|
||||
union MBOX_data {
|
||||
struct MBOX_Uint32 u32;
|
||||
struct MBOX_words u16;
|
||||
struct MBOX_bytes u8;
|
||||
struct SDOmsg SDO;
|
||||
};
|
||||
typedef volatile union MBOX_data TMBOX_data;
|
||||
|
||||
struct MID_bits
|
||||
{ Uint32 rsvd1:18; //пока не используем
|
||||
Uint32 senderNodeID:7; //номер узла
|
||||
Uint32 rsvd2:7; //пока не используем
|
||||
};
|
||||
union MID_data {
|
||||
Uint32 all;
|
||||
struct MID_bits bit;
|
||||
};
|
||||
// мейл-бокс
|
||||
struct MData
|
||||
{
|
||||
union MBOX_data data;
|
||||
union MID_data MID;
|
||||
};
|
||||
typedef volatile struct MData TCo_MOData;
|
||||
|
||||
//! Сборник данных всех мейл-боксов
|
||||
struct CO_MBOXDATA
|
||||
{
|
||||
struct MData MBOX_0;
|
||||
struct MData MBOX_1;
|
||||
struct MData MBOX_2;
|
||||
struct MData MBOX_3;
|
||||
struct MData MBOX_4;
|
||||
struct MData MBOX_5;
|
||||
struct MData MBOX_6;
|
||||
struct MData MBOX_7;
|
||||
struct MData MBOX_8;
|
||||
struct MData MBOX_9;
|
||||
struct MData MBOX_10;
|
||||
struct MData MBOX_11;
|
||||
struct MData MBOX_12;
|
||||
struct MData MBOX_13;
|
||||
struct MData MBOX_14;
|
||||
struct MData MBOX_15;
|
||||
struct MData MBOX_16;
|
||||
struct MData MBOX_17;
|
||||
struct MData MBOX_18;
|
||||
struct MData MBOX_19;
|
||||
struct MData MBOX_20;
|
||||
struct MData MBOX_21;
|
||||
struct MData MBOX_22;
|
||||
struct MData MBOX_23;
|
||||
struct MData MBOX_24;
|
||||
struct MData MBOX_25;
|
||||
struct MData MBOX_26;
|
||||
struct MData MBOX_27;
|
||||
struct MData MBOX_28;
|
||||
struct MData MBOX_29;
|
||||
struct MData MBOX_30;
|
||||
struct MData MBOX_31;
|
||||
};
|
||||
|
||||
typedef volatile struct CO_MBOXDATA TCo_MboxData;
|
||||
|
||||
//****************************************************************************************************************************************
|
||||
//структуры модуля блочной передачи
|
||||
#define BT_FIFO_SIZE 8 //8 сообщений должно хватить для 1Мбит/с, если обработка производится в 1мс
|
||||
//внутримодульные дефайны
|
||||
#define BT_FIFO_SUCCESSFUL 0
|
||||
#define BT_FIFO_EMPTY 1
|
||||
#define BT_FIFO_FULL 2
|
||||
#define BT_FIFO_BUSY 3
|
||||
|
||||
struct S_BT_FIFO
|
||||
{
|
||||
Uint16 busy_flag; //флаг занятости ФИФО, показывает количество инстанций, использующих ФИФО в данный момент
|
||||
Uint16 size;
|
||||
Uint16 number_of_msgs;
|
||||
Uint16 read_ptr;
|
||||
Uint16 write_ptr;
|
||||
TMBOX_data msg_array[BT_FIFO_SIZE];
|
||||
Uint16(*read)(volatile struct S_BT_FIFO*,TMBOX_data*);
|
||||
Uint16(*write)(volatile struct S_BT_FIFO*,TMBOX_data*);
|
||||
Uint16(*clear)(volatile struct S_BT_FIFO*);
|
||||
};
|
||||
|
||||
typedef volatile struct S_BT_FIFO T_BT_FIFO;
|
||||
|
||||
#define T_BT_FIFO_DEFAULTS {0,\
|
||||
BT_FIFO_SIZE,\
|
||||
0,0,0,\
|
||||
{0},\
|
||||
BT_FIFO_Read,\
|
||||
BT_FIFO_Write,\
|
||||
BT_FIFO_Clear}
|
||||
|
||||
Uint16 BT_FIFO_Read(T_BT_FIFO*,TMBOX_data*);
|
||||
Uint16 BT_FIFO_Write(T_BT_FIFO*,TMBOX_data*);
|
||||
Uint16 BT_FIFO_Clear(T_BT_FIFO* p);
|
||||
|
||||
#define CANBT_STATE_FREE 0
|
||||
#define CANBT_STATE_RX 1
|
||||
#define CANBT_STATE_TX 2
|
||||
|
||||
#define CANBT_STATUS_IDLE 0
|
||||
#define CANBT_STATUS_BUSY 1
|
||||
#define CANBT_STATUS_SUCCESSFUL 2
|
||||
#define CANBT_STATUS_TIMEOUT 3
|
||||
#define CANBT_STATUS_CRC_ERR 4
|
||||
#define CANBT_STATUS_ANY_ERR 5
|
||||
|
||||
struct SBlockTransfer
|
||||
{ Uint16 state; //Состояние.
|
||||
Uint16 state_shadow;//Теневое состояние.
|
||||
Uint16 state_prev; //Предыдущее состояние (на один такт)
|
||||
Uint16 E; //Флаг первого вхождения.
|
||||
Uint32 state_time; //время нахождения в текущем состоянии, в мс.
|
||||
Uint16 RX_block_size; //размер принимаемого блока (определяется пользователем перед приемом)
|
||||
Uint16 TX_block_size; //размер отправляемого блока (определяется пользователем перед отправкой)
|
||||
Uint16 firstTXmsg; //флаг, показывающий, что 1-е сообщение блока еще не отправлялось.
|
||||
Uint16* RX_dest_ptr;
|
||||
Uint16* TX_source_ptr;
|
||||
int RX_index;
|
||||
int TX_index;
|
||||
T_BT_FIFO RXmsgFIFO;
|
||||
T_BT_FIFO TXmsgFIFO;
|
||||
Uint16 blockCRC;
|
||||
Uint16 rx_status; //обратная связь для внешней программы использующей блочную передачу
|
||||
Uint16 tx_status; //
|
||||
Uint32 timeout;
|
||||
};
|
||||
|
||||
typedef volatile struct SBlockTransfer TBlockTransfer;
|
||||
|
||||
#define TBLOCK_TRANSFER_DEFAULTS {CANBT_STATE_FREE,\
|
||||
CANBT_STATE_FREE,0xff,1,\
|
||||
0,\
|
||||
0,0,0,0,0,0,0,\
|
||||
T_BT_FIFO_DEFAULTS,T_BT_FIFO_DEFAULTS,\
|
||||
0,\
|
||||
CANBT_STATUS_IDLE,CANBT_STATUS_IDLE,\
|
||||
((Uint32)500)/*500мс*/,\
|
||||
}
|
||||
|
||||
|
||||
//****************************************************************************************************************************************
|
||||
//структура работы с пользовательской памятью для сохранения и восстановления параметров словаря объектов
|
||||
struct S_UserMemoryContext
|
||||
{
|
||||
Uint16 MemStartAddr; //!Адрес в пользовательской памяти (побайтовый доступ)
|
||||
Uint16 *MCUStartAddr; //!Указатель на массив с данными в MCU
|
||||
Uint16 data_length; //!длина данных (в байтах)
|
||||
};
|
||||
typedef volatile struct S_UserMemoryContext T_UserMemoryContext;
|
||||
//****************************************************************************************************************************************
|
||||
|
||||
//Структура с данными драйвера CANOpen
|
||||
//Помимо служебных и пользоваельских данных, необходимых для работы драйвера,
|
||||
//в данную структуру входят стандартные переменные словаря CANOpen
|
||||
|
||||
struct SCo_OdVars{
|
||||
Uint32 co_deviceType; //1000.0
|
||||
Uint16 co_errorRegister; //1001.0 Регистр ошибки
|
||||
Uint32 co_deviceState; //1002.0
|
||||
Uint32 co_emcyCOBID; //1014.0
|
||||
Uint32 co_CHBT; //1016.1 Consumer heartbeat time
|
||||
Uint32 co_PHBT ; //1017.0 Producer heartbeat time
|
||||
Uint32 co_vendorID; //1018.1
|
||||
Uint32 co_productCode; //1018.2
|
||||
Uint32 co_revisionNumber; //1018.3
|
||||
Uint32 co_serialNumber; //1018.4
|
||||
Uint32 co_csrxCOBID; //1200.1
|
||||
Uint32 co_sctxCOBID; //1200.2
|
||||
Uint32 co_cstxCOBID; //1280.1
|
||||
Uint32 co_scrxCOBID; //1280.2
|
||||
Uint16 co_ssNODEID; //1280.3
|
||||
Uint32 co_RPDO1COBID; //1400.1
|
||||
Uint16 co_transType; //1400.2 , 1401.2 , 1402.2 , 1403.2
|
||||
Uint32 co_RPDO2COBID; //1401.1
|
||||
Uint32 co_RPDO3COBID; //1402.1
|
||||
Uint32 co_RPDO4COBID; //1403.1
|
||||
Uint32 co_RPDO5COBID; //1404.1 rwp
|
||||
Uint32 co_RPDO6COBID; //1405.1 rwp
|
||||
Uint32 co_RPDO7COBID; //1406.1 rwp
|
||||
Uint32 co_RPDO8COBID; //1407.1 rwp
|
||||
//
|
||||
Uint32 co_RPDO1_1Mapping; //1600.1
|
||||
Uint32 co_RPDO1_2Mapping; //1600.2
|
||||
Uint32 co_RPDO1_3Mapping; //1600.3
|
||||
Uint32 co_RPDO1_4Mapping; //1600.4
|
||||
Uint32 co_RPDO2_1Mapping; //1601.1
|
||||
Uint32 co_RPDO2_2Mapping; //1601.2
|
||||
Uint32 co_RPDO2_3Mapping; //1601.3
|
||||
Uint32 co_RPDO2_4Mapping; //1601.4
|
||||
Uint32 co_RPDO3_1Mapping; //1602.1
|
||||
Uint32 co_RPDO3_2Mapping; //1602.2
|
||||
Uint32 co_RPDO3_3Mapping; //1602.3
|
||||
Uint32 co_RPDO3_4Mapping; //1602.4
|
||||
Uint32 co_RPDO4_1Mapping; //1603.1
|
||||
Uint32 co_RPDO4_2Mapping; //1603.2
|
||||
Uint32 co_RPDO4_3Mapping; //1603.3
|
||||
Uint32 co_RPDO4_4Mapping; //1603.4
|
||||
//2007_03_14
|
||||
Uint32 co_RPDO5_1Mapping; //1604.1 rwp
|
||||
Uint32 co_RPDO5_2Mapping; //1604.2 rwp
|
||||
Uint32 co_RPDO5_3Mapping; //1604.3 rwp
|
||||
Uint32 co_RPDO5_4Mapping; //1604.4 rwp
|
||||
Uint32 co_RPDO6_1Mapping; //1605.1 rwp
|
||||
Uint32 co_RPDO6_2Mapping; //1605.2 rwp
|
||||
Uint32 co_RPDO6_3Mapping; //1605.3 rwp
|
||||
Uint32 co_RPDO6_4Mapping; //1605.4 rwp
|
||||
Uint32 co_RPDO7_1Mapping; //1606.1 rwp
|
||||
Uint32 co_RPDO7_2Mapping; //1606.2 rwp
|
||||
Uint32 co_RPDO7_3Mapping; //1606.3 rwp
|
||||
Uint32 co_RPDO7_4Mapping; //1606.4 rwp
|
||||
Uint32 co_RPDO8_1Mapping; //1607.1 rwp
|
||||
Uint32 co_RPDO8_2Mapping; //1607.2 rwp
|
||||
Uint32 co_RPDO8_3Mapping; //1607.3 rwp
|
||||
Uint32 co_RPDO8_4Mapping; //1607.4 rwp
|
||||
//
|
||||
Uint32 co_TPDO1COBID; //1800.1
|
||||
Uint16 co_TPDO1ITime; //1800.3 rw
|
||||
Uint16 co_compatEntry; //1800.4 rw
|
||||
Uint16 co_TPDO1EventTimer; //1800.5 rw
|
||||
Uint32 co_TPDO2COBID; //1801.1
|
||||
Uint16 co_TPDO2ITime; //1801.3 rw
|
||||
Uint16 co_TPDO2EventTimer; //1800.5 rw
|
||||
Uint32 co_TPDO3COBID; //1802.1
|
||||
Uint16 co_TPDO3ITime; //1802.3 rw
|
||||
Uint16 co_TPDO3EventTimer; //1800.5 rw
|
||||
Uint32 co_TPDO4COBID; //1803.1
|
||||
Uint16 co_TPDO4ITime; //1803.3 rw
|
||||
Uint16 co_TPDO4EventTimer; //1800.5 rw
|
||||
Uint32 co_TPDO5COBID; //1804.1 r
|
||||
Uint16 co_TPDO5ITime; //1804.3 rw
|
||||
Uint16 co_TPDO5EventTimer; //1804.5 rw
|
||||
Uint32 co_TPDO6COBID; //1805.1 r
|
||||
Uint16 co_TPDO6ITime; //1805.3 rw
|
||||
Uint16 co_TPDO6EventTimer; //1805.5 rw
|
||||
Uint32 co_TPDO7COBID; //1806.1 r
|
||||
Uint16 co_TPDO7ITime; //1806.3 rw
|
||||
Uint16 co_TPDO7EventTimer; //1806.5 rw
|
||||
Uint32 co_TPDO8COBID; //1807.1 r
|
||||
Uint16 co_TPDO8ITime; //1807.3 rw
|
||||
Uint16 co_TPDO8EventTimer; //1807.5 rw
|
||||
//
|
||||
Uint32 co_TPDO1_1Mapping; //1A00.1
|
||||
Uint32 co_TPDO1_2Mapping; //1A00.2
|
||||
Uint32 co_TPDO1_3Mapping; //1A00.3
|
||||
Uint32 co_TPDO1_4Mapping; //1A00.4
|
||||
Uint32 co_TPDO2_1Mapping; //1A01.1
|
||||
Uint32 co_TPDO2_2Mapping; //1A01.2
|
||||
Uint32 co_TPDO2_3Mapping; //1A01.3
|
||||
Uint32 co_TPDO2_4Mapping; //1A01.4
|
||||
Uint32 co_TPDO3_1Mapping; //1A02.1
|
||||
Uint32 co_TPDO3_2Mapping; //1A02.2
|
||||
Uint32 co_TPDO3_3Mapping; //1A02.3
|
||||
Uint32 co_TPDO3_4Mapping; //1A02.4
|
||||
Uint32 co_TPDO4_1Mapping; //1A03.1
|
||||
Uint32 co_TPDO4_2Mapping; //1A03.2
|
||||
Uint32 co_TPDO4_3Mapping; //1A03.3
|
||||
Uint32 co_TPDO4_4Mapping; //1A03.4
|
||||
Uint32 co_TPDO5_1Mapping; //1A04.1 rwp
|
||||
Uint32 co_TPDO5_2Mapping; //1A04.2 rwp
|
||||
Uint32 co_TPDO5_3Mapping; //1A04.3 rwp
|
||||
Uint32 co_TPDO5_4Mapping; //1A04.4 rwp
|
||||
Uint32 co_TPDO6_1Mapping; //1A05.1 rwp
|
||||
Uint32 co_TPDO6_2Mapping; //1A05.2 rwp
|
||||
Uint32 co_TPDO6_3Mapping; //1A05.3 rwp
|
||||
Uint32 co_TPDO6_4Mapping; //1A05.4 rwp
|
||||
Uint32 co_TPDO7_1Mapping; //1A06.1 rwp
|
||||
Uint32 co_TPDO7_2Mapping; //1A06.2 rwp
|
||||
Uint32 co_TPDO7_3Mapping; //1A06.3 rwp
|
||||
Uint32 co_TPDO7_4Mapping; //1A06.4 rwp
|
||||
Uint32 co_TPDO8_1Mapping; //1A07.1 rwp
|
||||
Uint32 co_TPDO8_2Mapping; //1A07.2 rwp
|
||||
Uint32 co_TPDO8_3Mapping; //1A07.3 rwp
|
||||
Uint32 co_TPDO8_4Mapping; //1A07.4 rwp
|
||||
//
|
||||
Uint16 co_nodeID ; //2000.0 номер данного узла
|
||||
Uint16 co_bitRate; //2001.0
|
||||
Uint16 co_specialData1; //2003.1
|
||||
Uint16 co_specialData2; //2003.2
|
||||
Uint16 co_specialData3; //2003.3
|
||||
Uint16 co_specialData4; //2003.4
|
||||
Uint32 co_secretCode; //2004.0
|
||||
Uint16 co_protectBit; //2005.0
|
||||
Uint32 co_devicePresentFlag0;
|
||||
Uint32 co_devicePresentFlag1;
|
||||
Uint32 co_devicePresentFlag2;
|
||||
Uint32 co_devicePresentFlag3;
|
||||
Uint32 co_deviceGlobalPresent0;
|
||||
Uint32 co_deviceGlobalPresent1;
|
||||
Uint32 co_deviceGlobalPresent2;
|
||||
Uint32 co_deviceGlobalPresent3;
|
||||
Uint32 co_heartbeatFlag0 ; //2010.1 Флаги heartbeat с 0 по 31-е устройство
|
||||
Uint32 co_heartbeatFlag1 ; //2010.2 Флаги heartbeat с 32 по 63-е устройство
|
||||
Uint32 co_heartbeatFlag2 ; //2010.3 Флаги heartbeat с 64 по 95-е устройство
|
||||
Uint32 co_heartbeatFlag3 ; //2010.4 Флаги heartbeat с 96 по 127-е устройство
|
||||
Uint32 co_heartbeatMask0 ; //2011.1 Маски heartbeat с 0 по 31-е устройство (0110b)
|
||||
Uint32 co_heartbeatMask1 ; //2011.2 Маски heartbeat с 32 по 63-е устройство
|
||||
Uint32 co_heartbeatMask2 ; //2011.3 Маски heartbeat с 64 по 95-е устройство
|
||||
Uint32 co_heartbeatMask3 ; //2011.4 Маски heartbeat с 96 по 127-е устройство
|
||||
Uint16 co_heartbeatAutoStart ; //2012.0 Параметр, определяющий возможен ли автозапуск сети
|
||||
Uint16 co_heartbeatAutoRecovery ; //2014.0 Параметр, определяющий возможен ли перезапуск системы из состояния STOPPED
|
||||
Uint16 co_nodeState ; //2015.0 состояние данного узла - вначале BOOTUP
|
||||
Uint16 co_emergencyErrorCode ; //2016.0 Код аварии
|
||||
Uint32 co_deviceErrorState ; //2017.0 Статусный регистр ошибок производителя
|
||||
Uint16 co_ODCommand; //2080.1
|
||||
Uint16 co_currentODIndex; //2080.2
|
||||
Uint16 co_currentODSubIndex; //2080.3
|
||||
Uint16 co_currentODEText; //2080.4
|
||||
Uint16 co_currentODEFormat; //2080.5
|
||||
Uint16 co_currentODEMin; //2080.6
|
||||
Uint16 co_currentODEMax; //2080.7
|
||||
Uint16 co_currentODEDefault; //2080.8
|
||||
Uint16 co_currentODEMinLow; //2080.9
|
||||
Uint16 co_currentODEMaxLow; //2080.10
|
||||
Uint16 co_currentODEDefaultLow; //2080.11
|
||||
Uint16 co_currentODEAddrHigh; //2080.12
|
||||
Uint16 co_currentODEAddrLow;
|
||||
Uint16 co_currentODEType;
|
||||
Uint16 co_odIndexSize;
|
||||
Uint32 co_defaultIndex1; //2082.1 rw
|
||||
Uint32 co_defaultIndex2; //2082.2 rw
|
||||
Uint16 co_maskElement01; //2083.1,2 rw
|
||||
Uint16 co_maskElement23; //2083.3,4 rw
|
||||
Uint16 co_maskElement45; //2083.5,6 rw
|
||||
Uint16 co_maskElement67; //2083.7,8 rw
|
||||
Uint16 co_maskElement89; //2083.9,A rw
|
||||
Uint16 co_maskElementAB; //2083.B,C rw
|
||||
Uint16 co_maskElementCD; //2083.D,E rw
|
||||
Uint16 co_maskElementEF; //2083.F,10 rw
|
||||
Uint16 co_profileAccessMask; //2081.0 rw
|
||||
Uint16 co_scaleNum0; //2100.1
|
||||
Uint16 co_scaleNum0Format; //2100.2
|
||||
Uint16 co_scaleNum1; //2101.1
|
||||
Uint16 co_scaleNum1Format; //2101.2
|
||||
Uint16 co_scaleNum2; //2102.1
|
||||
Uint16 co_scaleNum2Format; //2102.2
|
||||
Uint16 co_scaleNum3; //2103.1
|
||||
Uint16 co_scaleNum3Format; //2103.2
|
||||
Uint16 co_scaleNum4; //2104.1
|
||||
Uint16 co_scaleNum4Format; //2104.2
|
||||
Uint16 co_scaleNum5; //2105.1
|
||||
Uint16 co_scaleNum5Format; //2105.2
|
||||
Uint16 co_scaleNum6; //2106.1
|
||||
Uint16 co_scaleNum6Format; //2106.2
|
||||
Uint16 co_scaleNum7; //2107.1
|
||||
Uint16 co_scaleNum7Format; //2107.2
|
||||
Uint16 co_scaleNum8; //2108.1
|
||||
Uint16 co_scaleNum8Format; //2108.2
|
||||
Uint16 co_scaleNum9; //2109.1
|
||||
Uint16 co_scaleNum9Format; //2109.2
|
||||
Uint16 co_scaleNumA; //210A.1
|
||||
Uint16 co_scaleNumAFormat; //210A.2
|
||||
Uint16 co_scaleNumB; //210B.1
|
||||
Uint16 co_scaleNumBFormat; //210B.2
|
||||
Uint16 co_scaleNumC; //210C.1
|
||||
Uint16 co_scaleNumCFormat; //210C.2
|
||||
Uint16 co_scaleNumD; //210D.1
|
||||
Uint16 co_scaleNumDFormat; //210D.2
|
||||
Uint16 co_scaleNumE; //210E.1
|
||||
Uint16 co_scaleNumEFormat; //210E.2
|
||||
Uint16 co_scaleNumF; //210F.1
|
||||
Uint16 co_scaleNumFFormat; //210F.2
|
||||
Uint16 co_scaleNum10; //2110.1
|
||||
Uint16 co_scaleNum10Format; //2110.2
|
||||
Uint16 co_scaleNum11; //2111.1
|
||||
Uint16 co_scaleNum11Format; //2111.2
|
||||
Uint16 co_scaleNum12; //2112.1
|
||||
Uint16 co_scaleNum12Format; //2112.2
|
||||
Uint16 co_scaleNum13; //2113.1
|
||||
Uint16 co_scaleNum13Format; //2113.2
|
||||
Uint16 co_scaleNum14; //2114.1
|
||||
Uint16 co_scaleNum14Format; //2114.2
|
||||
Uint16 co_scaleNum15; //2115.1
|
||||
Uint16 co_scaleNum15Format; //2115.2
|
||||
Uint16 co_scaleNum16; //2116.1
|
||||
Uint16 co_scaleNum16Format; //2116.2
|
||||
Uint16 co_scaleNum17; //2117.1
|
||||
Uint16 co_scaleNum17Format; //2117.2
|
||||
Uint16 co_scaleNum18; //2118.1
|
||||
Uint16 co_scaleNum18Format; //2118.2
|
||||
Uint16 co_scaleNum19; //2119.1
|
||||
Uint16 co_scaleNum19Format; //2119.2
|
||||
Uint16 co_scaleNum1A; //211A.1
|
||||
Uint16 co_scaleNum1AFormat; //211A.2
|
||||
Uint16 co_scaleNum1B; //211B.1
|
||||
Uint16 co_scaleNum1BFormat; //211B.2
|
||||
Uint16 co_scaleNum1C; //211C.1
|
||||
Uint16 co_scaleNum1CFormat; //211C.2
|
||||
Uint16 co_scaleNum1D; //211D.1
|
||||
Uint16 co_scaleNum1DFormat; //211D.2
|
||||
Uint16 co_scaleNum1E; //211E.1
|
||||
Uint16 co_scaleNum1EFormat; //211E.2
|
||||
Uint16 co_scaleNum1F; //211F.1
|
||||
Uint16 co_scaleNum1FFormat; //211F.2
|
||||
|
||||
Uint16 co_blockTransferCommand; //2700
|
||||
|
||||
//Указатели
|
||||
Uint16 *co_currentWordODTbl1 ;//данные указатели ипользуются для работы интерпретатора
|
||||
Uint16 *co_currentWordODTbl2 ;//команд в прерывании ШИМ (для обработки быстрых команд)
|
||||
Uint16 co_currentAccessMask; //маска доступа индекса на который указывает co_currentWordODTbl1
|
||||
|
||||
Uint16 *co_shadow_currentWordODTbl1 ;//данные указатели ипользуются для работы интерпретатора
|
||||
Uint16 *co_shadow_currentWordODTbl2 ;//команд в фоновой программе (для обработки медленных команд)
|
||||
|
||||
Uint16 *co_SDOcurrentWordODTbl1;
|
||||
Uint16 *co_SDOcurrentWordODTbl2;
|
||||
|
||||
//ExternalInterface
|
||||
Uint16 *Z_co_SDOcurrentWordODTbl1;
|
||||
Uint16 *Z_co_SDOcurrentWordODTbl2;
|
||||
|
||||
Uint16 *co_PDOcurrentWordODTbl1;
|
||||
Uint16 *co_PDOcurrentWordODTbl2;
|
||||
Uint16 *co_PDOMAPcurrentWordODTbl1;
|
||||
Uint16 *co_PDOMAPcurrentWordODTbl2;
|
||||
|
||||
Uint16 *co_endODTbl1 ;//указывает на последний элемент индекс в таблице ODTbl1
|
||||
|
||||
Uint32 co_MailboxMDRL;
|
||||
Uint32 co_MailboxMDRH;
|
||||
Uint32 co_MailboxMID;
|
||||
|
||||
Uint32 co_flagBackUp0;//
|
||||
Uint32 co_flagBackUp1;// предыдущие состояния флагов
|
||||
Uint32 co_flagBackUp2;//
|
||||
Uint32 co_flagBackUp3;//
|
||||
|
||||
Uint32 co_backupEEC; // Предыдущее состояние кода аварии
|
||||
Uint32 co_backupER; // Предыдущее состояние регистра ошибки
|
||||
Uint32 co_backupDES; // Предыдущее состояние статусного регистра ошибок производителя
|
||||
|
||||
Uint32 co_consHBTimeCounter;// изначально должен быть равен co_CHBT
|
||||
Uint32 co_prodHBTimeCounter;// изначально должен быть равен co_PHBT
|
||||
Uint32 co_emcyNewState; // Состояние в которое перешел узел после ошибки
|
||||
Uint32 co_msDevisor; // делитель частоты для получения 1мс - используется для отправки Heartbeat
|
||||
|
||||
Uint16 co_shadow_currentODIndex;
|
||||
Uint16 co_shadow_currentODSubIndex;
|
||||
Uint16 co_shadow_currentODEText;
|
||||
Uint16 co_shadow_currentODEFormat;
|
||||
Uint16 co_shadow_currentODEMin;
|
||||
Uint16 co_shadow_currentODEMax;
|
||||
Uint16 co_shadow_currentODEDefault;
|
||||
Uint16 co_shadow_currentODEMinLow;
|
||||
Uint16 co_shadow_currentODEMaxLow;
|
||||
Uint16 co_shadow_currentODEDefaultLow;
|
||||
Uint16 co_shadow_currentODEAddrLow;
|
||||
Uint16 co_shadow_currentODEAddrHigh;
|
||||
Uint16 co_shadow_currentODEType;
|
||||
//переменные необходимые для работы SDO служб
|
||||
Uint16 co_SDOrequestIndex;
|
||||
Uint16 co_SDOrequestSubIndex;
|
||||
Uint16 co_SDOrequestData;
|
||||
Uint16 co_SDOrequestDataH;
|
||||
Uint16 co_SDOrequestStatus;
|
||||
Uint16 co_SDOrequestFlag;
|
||||
Uint16 co_SDOSuspendedSend;
|
||||
TMBOX_data SDOMsgData;
|
||||
|
||||
//временная переменная защиты секретных параметров от несанкционированного доступа
|
||||
Uint16 co_secretProtectBit;
|
||||
|
||||
//переменные необходимые для работы PDO служб
|
||||
Uint16 co_PDOMappingFlags;//RRRR RRRR TTTT TTTT - "T" - TPDO;- "R" - RPDO
|
||||
|
||||
Uint16 co_PDO1Devisor; // делитель для получения заданной скорости передачи PDO1
|
||||
Uint16 co_PDO2Devisor;
|
||||
Uint16 co_PDO3Devisor;
|
||||
Uint16 co_PDO4Devisor;
|
||||
Uint16 co_PDO5Devisor;
|
||||
Uint16 co_PDO6Devisor;
|
||||
Uint16 co_PDO7Devisor;
|
||||
Uint16 co_PDO8Devisor;
|
||||
//
|
||||
Uint16 co_NumOfNextPDO;
|
||||
Uint16 co_PDOTransmitFlags;//0000 0000 TTTT TTTT
|
||||
Uint16 co_PDOTransmitEna; //0000 0000 TTTT TTTT
|
||||
Uint16 co_PDOReceiveEna; //0000 0000 RRRR RRRR
|
||||
|
||||
Uint16 co_my_PDO1TransmitFlags;
|
||||
Uint16 co_my_PDO2TransmitFlags;
|
||||
Uint16 co_my_PDO3TransmitFlags;
|
||||
Uint16 co_my_PDO4TransmitFlags;
|
||||
Uint16 co_my_PDO5TransmitFlags;
|
||||
Uint16 co_my_PDO6TransmitFlags;
|
||||
Uint16 co_my_PDO7TransmitFlags;
|
||||
Uint16 co_my_PDO8TransmitFlags;
|
||||
|
||||
|
||||
Uint32 co_RPDO1_addr[RPDO1NUMOFPARAMS];
|
||||
Uint32 co_RPDO2_addr[RPDO2NUMOFPARAMS];
|
||||
Uint32 co_RPDO3_addr[RPDO3NUMOFPARAMS];
|
||||
Uint32 co_RPDO4_addr[RPDO4NUMOFPARAMS];
|
||||
Uint32 co_RPDO5_addr[RPDO5NUMOFPARAMS];
|
||||
Uint32 co_RPDO6_addr[RPDO6NUMOFPARAMS];
|
||||
Uint32 co_RPDO7_addr[RPDO7NUMOFPARAMS];
|
||||
Uint32 co_RPDO8_addr[RPDO8NUMOFPARAMS];
|
||||
//
|
||||
|
||||
Uint16 co_RPDO1_startBit[RPDO1NUMOFPARAMS];
|
||||
Uint16 co_RPDO2_startBit[RPDO2NUMOFPARAMS];
|
||||
Uint16 co_RPDO3_startBit[RPDO3NUMOFPARAMS];
|
||||
Uint16 co_RPDO4_startBit[RPDO4NUMOFPARAMS];
|
||||
Uint16 co_RPDO5_startBit[RPDO5NUMOFPARAMS];
|
||||
Uint16 co_RPDO6_startBit[RPDO6NUMOFPARAMS];
|
||||
Uint16 co_RPDO7_startBit[RPDO7NUMOFPARAMS];
|
||||
Uint16 co_RPDO8_startBit[RPDO8NUMOFPARAMS];
|
||||
//
|
||||
|
||||
Uint16 co_RPDO1_numOfBits[RPDO1NUMOFPARAMS];
|
||||
Uint16 co_RPDO2_numOfBits[RPDO2NUMOFPARAMS];
|
||||
Uint16 co_RPDO3_numOfBits[RPDO3NUMOFPARAMS];
|
||||
Uint16 co_RPDO4_numOfBits[RPDO4NUMOFPARAMS];
|
||||
Uint16 co_RPDO5_numOfBits[RPDO5NUMOFPARAMS];
|
||||
Uint16 co_RPDO6_numOfBits[RPDO6NUMOFPARAMS];
|
||||
Uint16 co_RPDO7_numOfBits[RPDO7NUMOFPARAMS];
|
||||
Uint16 co_RPDO8_numOfBits[RPDO8NUMOFPARAMS];
|
||||
//
|
||||
|
||||
Uint32 co_TPDO1_addr[TPDO1NUMOFPARAMS];
|
||||
Uint32 co_TPDO2_addr[TPDO2NUMOFPARAMS];
|
||||
Uint32 co_TPDO3_addr[TPDO3NUMOFPARAMS];
|
||||
Uint32 co_TPDO4_addr[TPDO4NUMOFPARAMS];
|
||||
Uint32 co_TPDO5_addr[TPDO5NUMOFPARAMS];
|
||||
Uint32 co_TPDO6_addr[TPDO6NUMOFPARAMS];
|
||||
Uint32 co_TPDO7_addr[TPDO7NUMOFPARAMS];
|
||||
Uint32 co_TPDO8_addr[TPDO8NUMOFPARAMS];
|
||||
//
|
||||
|
||||
Uint16 co_TPDO1_startBit[TPDO1NUMOFPARAMS];
|
||||
Uint16 co_TPDO2_startBit[TPDO2NUMOFPARAMS];
|
||||
Uint16 co_TPDO3_startBit[TPDO3NUMOFPARAMS];
|
||||
Uint16 co_TPDO4_startBit[TPDO4NUMOFPARAMS];
|
||||
Uint16 co_TPDO5_startBit[TPDO5NUMOFPARAMS];
|
||||
Uint16 co_TPDO6_startBit[TPDO6NUMOFPARAMS];
|
||||
Uint16 co_TPDO7_startBit[TPDO7NUMOFPARAMS];
|
||||
Uint16 co_TPDO8_startBit[TPDO8NUMOFPARAMS];
|
||||
//
|
||||
|
||||
Uint16 co_TPDO1_numOfBits[TPDO1NUMOFPARAMS];
|
||||
Uint16 co_TPDO2_numOfBits[TPDO2NUMOFPARAMS];
|
||||
Uint16 co_TPDO3_numOfBits[TPDO3NUMOFPARAMS];
|
||||
Uint16 co_TPDO4_numOfBits[TPDO4NUMOFPARAMS];
|
||||
Uint16 co_TPDO5_numOfBits[TPDO5NUMOFPARAMS];
|
||||
Uint16 co_TPDO6_numOfBits[TPDO6NUMOFPARAMS];
|
||||
Uint16 co_TPDO7_numOfBits[TPDO7NUMOFPARAMS];
|
||||
Uint16 co_TPDO8_numOfBits[TPDO8NUMOFPARAMS];
|
||||
|
||||
//данные для работы с энергонезависимой памятью
|
||||
T_UserMemoryContext UM;
|
||||
|
||||
Uint16 ParamRestorationError;
|
||||
Uint16 co_requestCANInit;
|
||||
Uint16 co_callbackTag; //передается в колбэк функции драйвера (соответствует 1 для 1го CAN и 2 для 2го CAN)
|
||||
Uint32 ISRDroppingCounter;
|
||||
//данные из coodedit-а
|
||||
//Uint16 co_numOfInd;
|
||||
int16* OD_TBL1;
|
||||
Uint16* OD_TBL2;
|
||||
int32* OD_TBL3;
|
||||
Uint16* TYPE_DEF_TABLE;
|
||||
int32* OD_CALLBACK_TBL;
|
||||
|
||||
Uint16 co_SPIrange1rw;
|
||||
Uint16 co_SPIrange1rwCRC;
|
||||
Uint16 co_SPIrange1rwp;
|
||||
Uint16 co_SPIrange1rwpCRC;
|
||||
Uint16 co_SPIrange1rwps;
|
||||
Uint16 co_SPIrange1rwpsCRC;
|
||||
Uint16 co_SPIrange2rw;
|
||||
Uint16 co_SPIrange2rwCRC;
|
||||
Uint16 co_SPIrange2rwp;
|
||||
Uint16 co_SPIrange2rwpCRC;
|
||||
Uint16 co_SPIrange2rwps;
|
||||
Uint16 co_SPIrange2rwpsCRC;
|
||||
Uint16 co_SPIrange3rw;
|
||||
Uint16 co_SPIrange3rwCRC;
|
||||
Uint16 co_SPIrange3rwp;
|
||||
Uint16 co_SPIrange3rwpCRC;
|
||||
Uint16 co_SPIrange3rwps;
|
||||
Uint16 co_SPIrange3rwpsCRC;
|
||||
Uint16 co_SPIrange4rw;
|
||||
Uint16 co_SPIrange4rwCRC;
|
||||
Uint16 co_SPIrange4rwp;
|
||||
Uint16 co_SPIrange4rwpCRC;
|
||||
Uint16 co_SPIrange4rwps;
|
||||
Uint16 co_SPIrange4rwpsCRC;
|
||||
Uint16 co_SPIrange5rw;
|
||||
Uint16 co_SPIrange5rwCRC;
|
||||
Uint16 co_SPIrange5rwp;
|
||||
Uint16 co_SPIrange5rwpCRC;
|
||||
Uint16 co_SPIrange5rwps;
|
||||
Uint16 co_SPIrange5rwpsCRC;
|
||||
Uint16 co_first1000;
|
||||
Uint16 co_first2000;
|
||||
Uint16 co_first3000;
|
||||
Uint16 co_first4000;
|
||||
Uint16 co_first5000;
|
||||
//указатели для работы с регистрами и функциями, привязанными к аппаратной части
|
||||
_CAN_Node_TypeDef* CAN_NODE_REGS;
|
||||
CAN_TypeDef* CAN_REGS;
|
||||
Uint16 CAN_NODE_MO_OFFSET;
|
||||
Uint16 CAN_NODE_LIST;
|
||||
Uint16 CAN_MO_ISR_LINE;
|
||||
Uint16 CAN_NVIC_ISR_LINE;
|
||||
void (*GpioInit)();
|
||||
void (*CANINTDisable)();
|
||||
void (*CANINTEnable)();
|
||||
TBlockTransfer* BT; //указатель делаем чтоб легко инициализировать структуру TBlockTransfer
|
||||
T_CANOPEN_DRV_SETTINGS settings;
|
||||
};
|
||||
|
||||
typedef volatile struct SCo_OdVars TCo_OdVars;
|
||||
|
||||
extern TCo_OdVars co1_vars;
|
||||
extern TCo_OdVars co2_vars;
|
||||
extern TBlockTransfer CAN1BlockTransfer;
|
||||
extern TBlockTransfer CAN2BlockTransfer;
|
||||
|
||||
//***************************************************************************************************************************************************
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
78
Vinclude/cood1.h
Normal file
78
Vinclude/cood1.h
Normal file
@ -0,0 +1,78 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file cood2.h
|
||||
\brief Îáúÿâëÿåò íåêîòîðûå ñëóæåáíûå ïåðåìåííûå, ñîòîðûå äîëæíû áûòü îïðåäåëåíû â cood2.c
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.0 2017_01_25
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
#include "DSP.h"
|
||||
|
||||
//********************************************************************************************************
|
||||
//ãëîáàëüíûå ïåðåìåííûå 1-ãî CAN-à
|
||||
extern int16 const CO1_OD_TBL1[];
|
||||
extern Uint16 const CO1_OD_TBL2[];
|
||||
extern long const CO1_OD_TBL3[];
|
||||
extern Uint16 const CO1_TYPE_DEF_TABLE[];
|
||||
extern long const CO1_OD_CALLBACK_TBL[];
|
||||
|
||||
extern Uint16 const co1_first1000;
|
||||
extern Uint16 const co1_first2000;
|
||||
extern Uint16 const co1_first3000;
|
||||
extern Uint16 const co1_first4000;
|
||||
extern Uint16 const co1_first5000;
|
||||
|
||||
extern Uint16 const co1_SPIrange1rw;
|
||||
extern Uint16 const co1_SPIrange1rwCRC;
|
||||
extern Uint16 const co1_SPIrange1rwp;
|
||||
extern Uint16 const co1_SPIrange1rwpCRC;
|
||||
extern Uint16 const co1_SPIrange1rwps;
|
||||
extern Uint16 const co1_SPIrange1rwpsCRC;
|
||||
|
||||
extern Uint16 const co1_SPIrange2rw;
|
||||
extern Uint16 const co1_SPIrange2rwCRC;
|
||||
extern Uint16 const co1_SPIrange2rwp;
|
||||
extern Uint16 const co1_SPIrange2rwpCRC;
|
||||
extern Uint16 const co1_SPIrange2rwps;
|
||||
extern Uint16 const co1_SPIrange2rwpsCRC;
|
||||
|
||||
extern Uint16 const co1_SPIrange3rw;
|
||||
extern Uint16 const co1_SPIrange3rwCRC;
|
||||
extern Uint16 const co1_SPIrange3rwp;
|
||||
extern Uint16 const co1_SPIrange3rwpCRC;
|
||||
extern Uint16 const co1_SPIrange3rwps;
|
||||
extern Uint16 const co1_SPIrange3rwpsCRC;
|
||||
|
||||
extern Uint16 const co1_SPIrange4rw;
|
||||
extern Uint16 const co1_SPIrange4rwCRC;
|
||||
extern Uint16 const co1_SPIrange4rwp;
|
||||
extern Uint16 const co1_SPIrange4rwpCRC;
|
||||
extern Uint16 const co1_SPIrange4rwps;
|
||||
extern Uint16 const co1_SPIrange4rwpsCRC;
|
||||
|
||||
extern Uint16 const co1_SPIrange5rw;
|
||||
extern Uint16 const co1_SPIrange5rwCRC;
|
||||
extern Uint16 const co1_SPIrange5rwp;
|
||||
extern Uint16 const co1_SPIrange5rwpCRC;
|
||||
extern Uint16 const co1_SPIrange5rwps;
|
||||
extern Uint16 const co1_SPIrange5rwpsCRC;
|
||||
|
||||
extern Uint16 const co1_numOfInd;
|
||||
|
||||
/*@}*/
|
||||
|
78
Vinclude/cood2.h
Normal file
78
Vinclude/cood2.h
Normal file
@ -0,0 +1,78 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file cood2.h
|
||||
\brief Îáúÿâëÿåò íåêîòîðûå ñëóæåáíûå ïåðåìåííûå, ñîòîðûå äîëæíû áûòü îïðåäåëåíû â cood2.c
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.0 2017_01_25
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
#include "DSP.h"
|
||||
|
||||
//********************************************************************************************************
|
||||
//ãëîáàëüíûå ïåðåìåííûå 2-ãî CAN-à
|
||||
extern int16 const CO2_OD_TBL1[];
|
||||
extern Uint16 const CO2_OD_TBL2[];
|
||||
extern long const CO2_OD_TBL3[];
|
||||
extern Uint16 const CO2_TYPE_DEF_TABLE[];
|
||||
extern long const CO2_OD_CALLBACK_TBL[];
|
||||
|
||||
extern Uint16 const co2_first1000;
|
||||
extern Uint16 const co2_first2000;
|
||||
extern Uint16 const co2_first3000;
|
||||
extern Uint16 const co2_first4000;
|
||||
extern Uint16 const co2_first5000;
|
||||
|
||||
extern Uint16 const co2_SPIrange1rw;
|
||||
extern Uint16 const co2_SPIrange1rwCRC;
|
||||
extern Uint16 const co2_SPIrange1rwp;
|
||||
extern Uint16 const co2_SPIrange1rwpCRC;
|
||||
extern Uint16 const co2_SPIrange1rwps;
|
||||
extern Uint16 const co2_SPIrange1rwpsCRC;
|
||||
|
||||
extern Uint16 const co2_SPIrange2rw;
|
||||
extern Uint16 const co2_SPIrange2rwCRC;
|
||||
extern Uint16 const co2_SPIrange2rwp;
|
||||
extern Uint16 const co2_SPIrange2rwpCRC;
|
||||
extern Uint16 const co2_SPIrange2rwps;
|
||||
extern Uint16 const co2_SPIrange2rwpsCRC;
|
||||
|
||||
extern Uint16 const co2_SPIrange3rw;
|
||||
extern Uint16 const co2_SPIrange3rwCRC;
|
||||
extern Uint16 const co2_SPIrange3rwp;
|
||||
extern Uint16 const co2_SPIrange3rwpCRC;
|
||||
extern Uint16 const co2_SPIrange3rwps;
|
||||
extern Uint16 const co2_SPIrange3rwpsCRC;
|
||||
|
||||
extern Uint16 const co2_SPIrange4rw;
|
||||
extern Uint16 const co2_SPIrange4rwCRC;
|
||||
extern Uint16 const co2_SPIrange4rwp;
|
||||
extern Uint16 const co2_SPIrange4rwpCRC;
|
||||
extern Uint16 const co2_SPIrange4rwps;
|
||||
extern Uint16 const co2_SPIrange4rwpsCRC;
|
||||
|
||||
extern Uint16 const co2_SPIrange5rw;
|
||||
extern Uint16 const co2_SPIrange5rwCRC;
|
||||
extern Uint16 const co2_SPIrange5rwp;
|
||||
extern Uint16 const co2_SPIrange5rwpCRC;
|
||||
extern Uint16 const co2_SPIrange5rwps;
|
||||
extern Uint16 const co2_SPIrange5rwpsCRC;
|
||||
|
||||
extern Uint16 const co2_numOfInd;
|
||||
|
||||
/*@}*/
|
||||
|
74
Vinclude/filter.h
Normal file
74
Vinclude/filter.h
Normal file
@ -0,0 +1,74 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file filter.h
|
||||
\brief Èíåðöèîííîå çâåíî â IQ ìàòåìàòèêå (ñì. TFilter)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup filter Èíåðöèîííûé ôèëüòð (ñì. TFilter)
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
#ifndef FILTER_H
|
||||
#define FILTER_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
/*! \class TFilter
|
||||
\brief Èíåðöèîííîå çâåíî â IQ ìàòåìàòèêå
|
||||
|
||||
Êëàññ \a TFilter, îñíîâàííûé íà ñòðóêòóðå SFilter, ïðåäñòàâëÿåò èç ñåáÿ
|
||||
èíåðöèîííîå çâåíî â òåðìèíàõ ÒÀÓ, à èìåííî W(p)=1/(Tfiltra*p+1).
|
||||
Îáû÷íî îíî èñïîëüçóåòñÿ â êà÷åñòâå èíåðöèîííî ôèëüòðà, íà âõîä êîòîðîãî
|
||||
ïîäàåòñÿ çàøóìëåííûé ñèãíàë, à íà âûõîäå îêàçûâàåòñÿ îòôèëüòðîâàííûé.*/
|
||||
|
||||
//! ñì. TFilter
|
||||
struct SFilter
|
||||
{
|
||||
long input;//! Âõîä
|
||||
long output;//! Âûõîä
|
||||
long T; //! T=Ts/Tfiltra ãäå - Tfiltra ïîñòîÿííàÿ âðåìåíè ôèëüòðà
|
||||
void (*calc)(volatile struct SFilter*);//óêàçàòåëü íà ôóíêöèþ ðàñ÷åòà
|
||||
};
|
||||
|
||||
typedef volatile struct SFilter TFilter;
|
||||
|
||||
//! èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define FILTER_DEFAULTS {0,0,_IQ(0.01), \
|
||||
TFilter_Calc}
|
||||
|
||||
//! \memberof TFilter
|
||||
void TFilter_Calc(TFilter*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
69
Vinclude/ipark.h
Normal file
69
Vinclude/ipark.h
Normal file
@ -0,0 +1,69 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file ipark.h
|
||||
\brief Ìîäóëü èíâåðñíûõ êîîðäèíàòíûõ ïðåîáðàçîâàíèé êîîðäèíàò (ñì. TIPark)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup IPark Èíâåðñíûå êîîðäèíàòíûå ïðåîáðàçîâàíèÿ (ñì. TIPark)
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifndef IPARK_H
|
||||
#define IPARK_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \class TIPark
|
||||
\brief Èíâåðñíûå êîîðäèíàòíûå ïðåîáðàçîâàíèÿ
|
||||
|
||||
Êëàññ \a TIPark, îñíîâàííûé íà ñòðóêòóðå SIPark, îáåñïå÷èâàåò
|
||||
ïîâîðîò âåêòîðà, çàäàííîãî â îðòîãîíàëüíûõ îñÿõ, íà òðåáóåìûé óãîë
|
||||
ïîâîðîòà ang. Èíâåðñèÿ çàêëþ÷àåòñÿ â îáðàòíîì óãëå ïîâîðîòà ïî ñðàâíåíèþ
|
||||
ñ ìîäóëåì TPark.*/
|
||||
|
||||
//! ñì. TIPark
|
||||
struct SIPark{ _iq ds;//!< Output: stationary d-axis stator variable
|
||||
_iq qs;//!< Output: stationary q-axis stator variable
|
||||
_iq ang;//!< Input: rotating angle (pu)
|
||||
_iq de;//!< Input: rotating d-axis stator variable
|
||||
_iq qe;//!< Input: rotating q-axis stator variable
|
||||
void (*calc)(struct SIPark*); //!< Pointer to calculation function
|
||||
};
|
||||
|
||||
typedef struct SIPark TIPark;
|
||||
|
||||
//! èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define IPARK_DEFAULTS { 0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
ipark_calc }
|
||||
|
||||
//! \memberof TIPark
|
||||
void ipark_calc(TIPark*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
192
Vinclude/main.h
Normal file
192
Vinclude/main.h
Normal file
@ -0,0 +1,192 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file main.h
|
||||
\brief Ãëàâíûé çàãîëîâî÷íûé ôàéë ïðîåêòà.
|
||||
Ïîäêëþ÷àåò â ñåáå âñå çàãîëîâî÷íûå ôàéëû âñåõ ìîäóëåé,
|
||||
Ñîäåðæèò îáúÿâëåíèÿ (extern) âñåõ íàèáîëåå âàæíûõ
|
||||
ãëîáàëüíûõ ñòðóêòóð è ïåðåìåííûõ.
|
||||
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup MAIN Ãëàâíûé ôàéë ïðîåêòà
|
||||
|
||||
@{*/
|
||||
|
||||
#ifndef MAIN_H
|
||||
#define MAIN_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "DSP.h"
|
||||
#include "build.h"
|
||||
#include "V_common.h"
|
||||
#include <stdlib.h> //äëÿ labs
|
||||
#include "V_IQmath.h"
|
||||
#include "SM_Sys.h"
|
||||
#include "SM_Net.h"
|
||||
#include "co_ODvars.h"
|
||||
#include "CANOpen_drv.h"
|
||||
#include "V_data_log.h"
|
||||
#include "SM_Protect.h"
|
||||
#include "V_bits_to_enum_numbers.h"
|
||||
#include "SM_Ctrl.h"
|
||||
#include "SM_CmdLogic.h"
|
||||
#include "V_RTC_Clock.h"
|
||||
#include "clarke.h"
|
||||
#include "park.h"
|
||||
#include "ipark.h"
|
||||
#include "V_pid_reg3.h"
|
||||
#include "V_pid_reg3_pos.h"
|
||||
#include "V_rmp_ctrl.h"
|
||||
#include "V_adc.h"
|
||||
#include "V_PWM_Module.h"
|
||||
#include "V_CurPar.h"
|
||||
#include "V_hzprof.h"
|
||||
#include "V_DPR_eCAP.h"
|
||||
#include "V_QEP.h"
|
||||
#include "V_led.h"
|
||||
#include "V_AutoOffset.h"
|
||||
#include "V_CANtoRS.h"
|
||||
#include "V_SSI_Encoder.h"
|
||||
#include "V_UserMemory.h"
|
||||
#include "V_rotor_observer.h"
|
||||
#include "V_relay_reg.h"
|
||||
#include "DRV_INTERFACE.h"
|
||||
#include "V_event_log.h"
|
||||
#include "Global_time.h"
|
||||
#include "V_fifo.h"
|
||||
#include "V_usblib.h"
|
||||
#include "V_watchdog.h"
|
||||
|
||||
extern TClarke clarke;
|
||||
extern TPark park;
|
||||
extern TIPark ipark;
|
||||
extern TPidReg3 pid_id;
|
||||
extern TPidReg3 pid_iq;
|
||||
extern TPidReg3 pid_ia;
|
||||
extern TPidReg3 pid_spd;
|
||||
extern TPidReg3_pos pid_pos;
|
||||
extern TSM_Sys sm_sys;
|
||||
extern Uint16 disp_group_number;
|
||||
extern TDataLog dlog;
|
||||
extern TSM_Protect sm_prot;
|
||||
extern TCmd cmd;
|
||||
extern TDrvStatus drv_status;
|
||||
extern TBitsToEnumNums pult_faults_lister;
|
||||
extern TSM_Ctrl sm_ctrl;
|
||||
extern TSM_CmdLogic sm_cmd_logic;
|
||||
extern TRefs refs;
|
||||
extern TSM_Net sm_net;
|
||||
extern TRMPCtrl rmp;
|
||||
extern TDrvParams drv_params;
|
||||
extern TAdcDrv adc;
|
||||
extern TPWM_Module pwm;
|
||||
extern TCurPar cur_par;
|
||||
extern TVhzProf vhz;
|
||||
extern TDPReCAP DPReCAP;
|
||||
extern TposspeedEqep posspeedEqep;
|
||||
extern TRTCClock RTCclock;
|
||||
extern TAutoOffset AutoOffset;
|
||||
extern TSSI_Encoder SSI_Encoder;
|
||||
extern TRotorObserver RotorObserver;
|
||||
extern TCANtoRS CANtoRS;
|
||||
extern TDrvInterface drv_interface;
|
||||
extern TLogger FaultLog;
|
||||
extern TGlobalTime global_time;
|
||||
|
||||
extern Uint16 msCounter;
|
||||
extern Uint16 FastCounter;
|
||||
extern Uint16 LoopCounter;
|
||||
extern Uint16 TIsr10;
|
||||
extern Uint16 TIsr1;
|
||||
extern int drv_status_code;
|
||||
extern Uint32 VendorToken;
|
||||
|
||||
volatile extern long Debug1;
|
||||
volatile extern long Debug2;
|
||||
volatile extern Uint16 Debug3;
|
||||
volatile extern Uint16 Debug4;
|
||||
volatile extern long DebugW1;
|
||||
volatile extern long DebugW2;
|
||||
volatile extern long DebugW3;
|
||||
volatile extern long DebugW4;
|
||||
volatile extern float DebugF1;
|
||||
volatile extern float DebugF2;
|
||||
volatile extern float DebugF3;
|
||||
volatile extern float DebugF4;
|
||||
|
||||
//Ñ÷åò÷èêè ïðåðûâàíèé ìîäóëÿ çàõâàòà
|
||||
extern Uint16 CounterCAP_isr;
|
||||
extern Uint16 cap0_counter;
|
||||
extern Uint16 cap1_counter;
|
||||
extern Uint16 cap2_counter;
|
||||
|
||||
extern unsigned long CpuTimerIsr1;
|
||||
extern TSysSwitches sw;
|
||||
|
||||
extern TUserMemory UserMem;
|
||||
extern Tled leds;
|
||||
//extern TCanBTInterface Can1BTInterface;
|
||||
//extern TCanBTInterface Can2BTInterface;
|
||||
extern TCANSpeedTableOptions canSpeedTable;
|
||||
|
||||
void callback_dlog(Uint16 par, Uint16 tag_CANnum);
|
||||
void callback_RTC(Uint16 par, Uint16 tag_CANnum);
|
||||
void propReset(void);
|
||||
|
||||
// Îáúÿâëåíèå ISR-îâ. Â CodeMaster-ñêîì è GCC-øíîì ñòàðòàïå îíè íàçèûâàþòñÿ ïî-ðàçíîìó
|
||||
#if defined (__GNUC__)
|
||||
void TIM1_IRQHandler(void);
|
||||
void TIM0_IRQHandler(void);
|
||||
void EPWM_TZ_0_IRQHandler(void);
|
||||
void ECAP0_IRQHandler(void);
|
||||
void ECAP1_IRQHandler(void);
|
||||
void ECAP2_IRQHandler(void);
|
||||
void EQEP1_IRQHandler(void);
|
||||
#elif defined (__CMCPPARM__)
|
||||
void TIM1_IRQHandler(void);
|
||||
void TIM0_IRQHandler(void);
|
||||
void PWM0_TZ_IRQHandler(void);
|
||||
void CAP0_IRQHandler(void);
|
||||
void CAP1_IRQHandler(void);
|
||||
void CAP2_IRQHandler(void);
|
||||
void QEP1_IRQHandler(void);
|
||||
#endif
|
||||
|
||||
#if defined(TRUE) && (TRUE != 1)
|
||||
#error "TRUE previously defined not equal to 1"
|
||||
#endif
|
||||
#if defined(FALSE) && (FALSE != 0)
|
||||
#error "FALSE previously defined not equal to 0"
|
||||
#endif
|
||||
#ifndef TRUE
|
||||
#define TRUE (1)
|
||||
#endif
|
||||
#ifndef FALSE
|
||||
#define FALSE (0)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/*@}*/
|
||||
|
44
Vinclude/mbod.h
Normal file
44
Vinclude/mbod.h
Normal file
@ -0,0 +1,44 @@
|
||||
/* Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
*/
|
||||
|
||||
#ifndef MBOD_H
|
||||
#define MBOD_H
|
||||
|
||||
#include "DSP.h"
|
||||
|
||||
|
||||
|
||||
#define MB_VAR_WRITE 1 // ïðèçíàê çàïèñè â ModBus-ïåðåìåííóþ
|
||||
#define MB_VAR_READ 2 // ïðèçíàê ÷òåíèÿ èç ModBus-ïåðåìåííîé
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Uint16 index; // ModBus-àäðåñ
|
||||
Uint16 type_or_acc; // íîìåð áèòà äëÿ áèòîâûõ ïåðåìåííûõ èëè ïðèçíàê çàïèñè/÷òåíèÿ
|
||||
// äëÿ HR/IR-ïåðåìåííûõ (äîëæåí ñáðàñûâàòüñÿ ïîëüçîâàòåëåì):
|
||||
// 1 - ïðîèçîøëà çàïèñü
|
||||
// 2 - ïðîèçîøëî ÷òåíèå
|
||||
Uint32 addr; // àäðåñ ïåðåìåííîé â êîíòðîëëåðå
|
||||
} MB_Record;
|
||||
|
||||
extern volatile MB_Record mbodHR[];
|
||||
extern volatile MB_Record mbodIR[];
|
||||
extern volatile MB_Record mbodC[];
|
||||
extern volatile MB_Record mbodDI[];
|
||||
|
||||
#endif
|
||||
|
68
Vinclude/park.h
Normal file
68
Vinclude/park.h
Normal file
@ -0,0 +1,68 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file park.h
|
||||
\brief Ìîäóëü êîîðäèíàòíûõ ïðåîáðàçîâàíèé êîîðäèíàò (ñì. TPark)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\defgroup Park Êîîðäèíàòíûå ïðåîáðàçîâàíèÿ (ñì. TPark)
|
||||
@{
|
||||
*/
|
||||
#ifndef PARK_H
|
||||
#define PARK_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "V_IQmath.h"
|
||||
|
||||
/*! \class TPark
|
||||
\brief Êîîðäèíàòíûå ïðåîáðàçîâàíèÿ
|
||||
|
||||
Êëàññ \a TPark, îñíîâàííûé íà ñòðóêòóðå SPark, îáåñïå÷èâàåò
|
||||
ïîâîðîò âåêòîðà (ds,qs), çàäàííîãî â îðòîãîíàëüíûõ îñÿõ, íà òðåáóåìûé óãîë
|
||||
ïîâîðîòà ang. Âûõîäíîé ïîâåðíóòûé âåêòîð ñîõðàíÿåòñÿ â ïåðåìåííûõ de,qe. */
|
||||
|
||||
//! ñì. TPark
|
||||
struct SPark{ _iq ds; //!< Input: stationary d-axis stator variable
|
||||
_iq qs; //!< Input: stationary q-axis stator variable
|
||||
_iq ang; //!< Input: rotating angle (pu)
|
||||
_iq de; //!< Output: rotating d-axis stator variable
|
||||
_iq qe; //!< Output: rotating q-axis stator variable
|
||||
void (*calc)(struct SPark*);//!< Pointer to calculation function
|
||||
};
|
||||
|
||||
typedef struct SPark TPark;
|
||||
|
||||
//! èíèöèàëèçàòîð ïî-óìîë÷àíèþ
|
||||
#define PARK_DEFAULTS { 0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
0, \
|
||||
park_calc }
|
||||
|
||||
//! \memberof TPark
|
||||
void park_calc(TPark*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*@}*/
|
400
Vsrc/CANOpenUDfuncs.c
Normal file
400
Vsrc/CANOpenUDfuncs.c
Normal file
@ -0,0 +1,400 @@
|
||||
/* ==================================================================================
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
//File name: CANOpenUDfuncs.c
|
||||
|
||||
//Description: Â ôàéë âûíåñåíû ôóíêöèè äðàéâåðà CANOpen îïðåäåëÿåìûå ïîëüçîâàòåëåì (êîëáýê ôóíêöèè, ôóíêöèè èíèöèàëèçàöèè è ò.ï.)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.0 2017_02_08
|
||||
|
||||
//=====================================================================================*/
|
||||
#include "DSP.h"
|
||||
#include "co_ODvars.h"
|
||||
#include "CANOpen_drv.h"
|
||||
#include "main.h"
|
||||
|
||||
//! Òàáëèöà ñ íàñòðîéêàìè ñêîðîñòåé CAN äëÿ ìèêðîêîíòðîëëåðîâ ôèðìû ÍÈÈÝÒ. Ðàñêîììåíòèòü íóæíîå.
|
||||
|
||||
// Âíîñèòü èçìåíåíèß â íèæåîïèñàííûå ïåðåìåííûå è ìàññèâû ÇÀÏÐÅÙÅÍÎ!!!
|
||||
|
||||
//! Ìèêðîêîíòðîëëåð Ê1921ÂÊ01Ò
|
||||
/*
|
||||
// kb/s: 125 50 125 250 500 1000
|
||||
TCANSpeedTableOptions canSpeedTable = { {1, 1, 1, 0, 0, 0 }, \
|
||||
{9, 24, 9, 39, 19, 9 }, \
|
||||
{6, 6, 6, 6, 6, 6 }, \
|
||||
{1, 1, 1, 1, 1, 1 }, \
|
||||
{1, 1, 1, 1, 1 , 1 }, \
|
||||
};
|
||||
// ^- íàñòðîéêà íà 125, ò.ê. 10 kb/s íå ðåàëèçóåìî
|
||||
*/
|
||||
//! Ìèêðîêîíòðîëëåð Ê1921ÂÊ028
|
||||
/*
|
||||
// kb/s: 125 50 125 250 500 1000
|
||||
TCANSpeedTableOptions canSpeedTable = { {1, 1, 1, 1, 0, 0 }, \
|
||||
{19, 49, 19, 9, 39, 19}, \
|
||||
{6, 6, 6, 6, 6, 6 }, \
|
||||
{1, 1, 1, 1, 1, 1 }, \
|
||||
{1, 1, 1, 1, 1 , 1 }, \
|
||||
};
|
||||
// ^- íàñòðîéêà íà 125, ò.ê. 10 kb/s íå ðåàëèçóåìî
|
||||
*/
|
||||
//! Ìèêðîêîíòðîëëåð Ê1921ÂÊ035
|
||||
// kb/s: 125 50 125 250 500 1000
|
||||
TCANSpeedTableOptions canSpeedTable = { {1, 1, 1, 0, 0, 0 }, \
|
||||
{9, 24, 9, 39, 19, 9 }, \
|
||||
{6, 6, 6, 6, 6, 6 }, \
|
||||
{1, 1, 1, 1, 1, 1 }, \
|
||||
{1, 1, 1, 1, 1 , 1 }, \
|
||||
};
|
||||
// ^- íàñòðîéêà íà 125, ò.ê. 10 kb/s íå ðåàëèçóåìî
|
||||
|
||||
//**********************************************************************************************************************************************************************************************************
|
||||
//ôóíêöèÿ èíèöèàëèçàöèè Gpio CAN1
|
||||
#ifdef CAN_1_ENABLE
|
||||
void co_CAN1GpioInit()
|
||||
{
|
||||
//ïåðåâîäèì ÃÏÈÎ íà âûïîëíåíèå ôóíêöèè CAN
|
||||
GPIOB->ALTFUNCSET = (1 << 14) + (1 << 15); //CAN_TX[0], CAN_RX[0]
|
||||
GPIOB->DENSET = (1 << 14) + (1 << 15);
|
||||
}
|
||||
#endif //CAN_1_ENABLE
|
||||
|
||||
//ôóíêöèÿ èíèöèàëèçàöèè Gpio CAN2
|
||||
#ifdef CAN_2_ENABLE
|
||||
void co_CAN2GpioInit()
|
||||
{
|
||||
// //âûáèðàåì àëüòåðíàòèâíóþ ôóíêöèþ ÃÏÈÎ
|
||||
//#if defined HW_VECTOR_MK_40_4
|
||||
// NT_COMMON_REG->GPIOPCTLC_bit.PIN1 = 1; //CAN_TX[1]
|
||||
// NT_COMMON_REG->GPIOPCTLC_bit.PIN2 = 1; //CAN_RX[1]
|
||||
//
|
||||
// //ïåðåâîäèì ÃÏÈÎ íà âûïîëíåíèå ôóíêöèè CAN
|
||||
// NT_GPIOC->ALTFUNCSET = (1 << 1) + (1 << 2); //CAN_TX[0], CAN_RX[0]
|
||||
//
|
||||
//#else
|
||||
// NT_COMMON_REG->GPIOPCTLF_bit.PIN14 = 0; //CAN_TX[1]
|
||||
// NT_COMMON_REG->GPIOPCTLF_bit.PIN15 = 0; //CAN_RX[1]
|
||||
//
|
||||
// //ïåðåâîäèì ÃÏÈÎ íà âûïîëíåíèå ôóíêöèè CAN
|
||||
// NT_GPIOF->ALTFUNCSET = (1 << 14) + (1 << 15); //CAN_TX[0], CAN_RX[0]
|
||||
//#endif
|
||||
//
|
||||
|
||||
}
|
||||
#endif //CAN_2_ENABLE
|
||||
//**********************************************************************************************************************************************************************************************************
|
||||
//Ôóíêöèè ðàáîòû ñ ýíåðãîíåçàâèñèìîé ïàìÿòüþ (â êà÷åñòâå ïàìÿòè ìîæåò èñïîëüçîâàòüñÿ êàê ïîëüçîâàòåëüñêàÿ ôëýø íà áîðòó MCU,
|
||||
// òàê è âíåøíå ïîäêëþ÷àåìàÿ, íàïðèìåð ÷åðåç SPI, eeprom).
|
||||
//Ôóíêöèè èñïîëüçóþòñÿ äðàéâåðîì CANopen ïðè ñîõðàíåíèè è âîññòàíîâëåíèè ïàðàìåòðîâ ñëîâàðÿ îáúåêòîâ
|
||||
//Ñ òî÷êè çðåíèÿ äðàéâåðà CANOpen ôóíêöèè ðåàëèçóþò ïîáàéòîâîå ÷òåíèå è çàïèñü èç/â ÝíÎÇÓ
|
||||
void co_UserMemoryRead (const T_UserMemoryContext *p)
|
||||
{
|
||||
// UserMem.MemStartAddr = p->MemStartAddr;
|
||||
// UserMem.MCUStartAddr = p->MCUStartAddr;
|
||||
// UserMem.data_length = p->data_length;
|
||||
// UserMem.read(&UserMem);
|
||||
}
|
||||
|
||||
void co_UserMemoryWrite (const T_UserMemoryContext *p)
|
||||
{
|
||||
// UserMem.MemStartAddr = p->MemStartAddr;
|
||||
// UserMem.MCUStartAddr = p->MCUStartAddr;
|
||||
// UserMem.data_length = p->data_length;
|
||||
// UserMem.write(&UserMem);
|
||||
}
|
||||
//**********************************************************************************************************************************************************************************************************
|
||||
|
||||
//ôóíêöèÿ, êîòîðàÿ âûçûâàåòñÿ äðàéâåðîì CANOpen ïðè íåîáõîäèìîñòè îòïðàâêè CAN ñîîáùåíèÿ âî âíåøíèé èíòåðôåéñ
|
||||
//âíóòðü ôóíêöèè ïîëüçîâàòåëåì äîëæåí áûòü âñòàâëåí âûçîâ ñîîòâåòñòâóþùåé ôóíêöèè, îñóùåñòâëÿþùåé ïåðåäà÷ó CAN ïàêåòà
|
||||
void co_CANToExtInterface_Send(TZCanMsg* MSG, Uint16 tag_CANnum)
|
||||
{
|
||||
CANtoRS.write(MSG,&CANtoRS);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//êîëáýêè ïî ïðèåìó PDO
|
||||
void co_RPDO1_Callback(Uint16 nodeID, Uint16 tag_CANnum)
|
||||
{
|
||||
/*
|
||||
switch(nodeID)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
//îáðàáàòûâàåì êàê-íèáóäü...
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
PDO_cntr2++;
|
||||
//îáðàáàòûâàåì êàê-íèáóäü...
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void co_RPDO2_Callback(Uint16 nodeID, Uint16 tag_CANnum)
|
||||
{
|
||||
/*
|
||||
switch(nodeID)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
//îáðàáàòûâàåì êàê-íèáóäü...
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void co_RPDO3_Callback(Uint16 nodeID, Uint16 tag_CANnum)
|
||||
{
|
||||
/*
|
||||
switch(nodeID)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
//îáðàáàòûâàåì êàê-íèáóäü...
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void co_RPDO4_Callback(Uint16 nodeID, Uint16 tag_CANnum)
|
||||
{
|
||||
/*
|
||||
switch(nodeID)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
//îáðàáàòûâàåì êàê-íèáóäü...
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void co_RPDO5_Callback(Uint16 nodeID, Uint16 tag_CANnum)
|
||||
{
|
||||
/*
|
||||
switch(nodeID)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
//îáðàáàòûâàåì êàê-íèáóäü...
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void co_RPDO6_Callback(Uint16 nodeID, Uint16 tag_CANnum)
|
||||
{
|
||||
/*
|
||||
switch(nodeID)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
//îáðàáàòûâàåì êàê-íèáóäü...
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void co_RPDO7_Callback(Uint16 nodeID, Uint16 tag_CANnum)
|
||||
{
|
||||
/*
|
||||
switch(nodeID)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
//îáðàáàòûâàåì êàê-íèáóäü...
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void co_RPDO8_Callback(Uint16 nodeID, Uint16 tag_CANnum)
|
||||
{
|
||||
/*
|
||||
switch(nodeID)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
//îáðàáàòûâàåì êàê-íèáóäü...
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
//!Îáðàùåíèå ïî CANopen ê ÷àñàì ðåàëüíîãî âðåìåíè.
|
||||
|
||||
//!Åñëè ïðîèñõîäèò çàïèñü â ïàðàìåòð [5139h.01h] Òåêóù. çíà÷.×àñû ðåàëüíîãî âðåìåíè,
|
||||
//òî âûçûâàåòñÿ callback_RTC - òàì óñòàíàâëèâàåòñÿ çàïðîñ íà êîððåêöèþ ÷àñîâ.
|
||||
|
||||
void callback_RTC(Uint16 par, Uint16 tag_CANnum) {
|
||||
if (par == 1) {
|
||||
RTCclock.setTimeFlag = 1; //ïðîèçîøëà çàïèñü â ÷àñû
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//!Îáðàùåíèå ê ïåðåìåííîé dlog.next_value_var ñ äàííûìè öèôðîâîãî îñöèëëîãðàôà.
|
||||
|
||||
//!Ñóùåñòâóåò ñïåöèàëüíûé èíòåðôåéñ, ïîçâîëÿþùèé àâòîìàòèçèðîâàòü ñ÷èòûâàíèå îññöèëëîãðàôèðóåìûõ ïåðåìåííûõ
|
||||
//!ìîäóëÿ TDataLog. Ýòà ôóíêöèÿ âûçûâàåòñÿ ïðè îáðàùåíèè ê ïåðåìåííîé, ÷åðåç êîòîðóþ âîçìîæíî ñ÷èòàòü çàïèñàííûå
|
||||
//!îñöèëëîãðàììû. Çàïèñü â ýòó ïåðåìåííóþ óñòàíàâëèâàåò òðåáóåìûé íîìåð áóôåðà (îäèí è 4õ) è íîìåð èçâëåêàåìîé òî÷êè.
|
||||
//!Ïðè ÷òåíèè æå â ýòó ïåðåìåííóþ âûäâèãàòþòñÿ ñàìè îòîñöèëëîãðàôôèðîâàííûå äàííûå.
|
||||
|
||||
void callback_dlog(Uint16 par, Uint16 tag_CANnum) {
|
||||
//åñëè çàïèñü, òî óñòàíîâèì áóôåð íà íóæíóþ òî÷êó
|
||||
if (par == 1) {
|
||||
//â ïåðåìåííóþ next_value_var çàïèñûâàåòñß æåëàåìîå ñìåùåíèå, íîìåð áóôåðà, èç êîòîðîãî õîòèì ÷èòàòü,
|
||||
//à òàê æå ðàçðåæèâàíèå
|
||||
dlog.buff_num = (long)((dlog.next_value_var >> 24) & 3); //èçâëåêàåòñß íîìåð áóôåðà
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
dlog.highPartOfValue = (int)((dlog.next_value_var >> 26) & 1); // îòäàâàòü ñòàðøóþ ÷àñòü 32-áèòíîãî çíà÷åíèÿ?
|
||||
#endif
|
||||
dlog.Rcounter = (dlog.next_value_var >> 16) & 0xFF; //êàêóþ òî÷êó íàäî îòäàâàòü
|
||||
|
||||
// //ïðîâåðßåì õîòßò ëè èñïîëüçîâàòü áëî÷íóþ ïåðåäà÷ó
|
||||
// if ((dlog.next_value_var & 0xffff) == 1) {
|
||||
// //õîòßò, ãîâîðèì îá ýòîì èíòåðôåéñó áëî÷íîé ïåðåäà÷è
|
||||
//#ifdef CAN_1_ENABLE
|
||||
// if (co1_vars.co_blockTransferCommand == CANBT_INTERFACE_FREE)
|
||||
// co1_vars.co_blockTransferCommand = CANBT_INTERFACE_DATALOG1;
|
||||
//#endif
|
||||
//#ifdef CAN_2_ENABLE
|
||||
// if (co2_vars.co_blockTransferCommand == CANBT_INTERFACE_FREE)
|
||||
// co2_vars.co_blockTransferCommand = CANBT_INTERFACE_DATALOG1;
|
||||
//#endif
|
||||
// }
|
||||
//#if DLOG_DATA_SIZE == 32
|
||||
// if ((dlog.next_value_var & 0xffff) == 2) {
|
||||
//#ifdef CAN_1_ENABLE
|
||||
// if (co1_vars.co_blockTransferCommand == CANBT_INTERFACE_FREE)
|
||||
// co1_vars.co_blockTransferCommand = CANBT_INTERFACE_DATALOG2;
|
||||
//#endif
|
||||
//#ifdef CAN_2_ENABLE
|
||||
// if (co2_vars.co_blockTransferCommand == CANBT_INTERFACE_FREE)
|
||||
// co2_vars.co_blockTransferCommand = CANBT_INTERFACE_DATALOG2;
|
||||
//#endif
|
||||
// }
|
||||
//#endif // DLOG_DATA_SIZE == 32
|
||||
|
||||
}
|
||||
|
||||
//âûäâèãàåì äàííûå:
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
switch (dlog.buff_num) { //òåêóùèé íîìåð áóôåðà
|
||||
case 0: {
|
||||
dlog.next_value_var = dlog.dl_buffer1_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF];
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
dlog.next_value_var = dlog.dl_buffer2_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF];
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
dlog.next_value_var = dlog.dl_buffer3_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF];
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
dlog.next_value_var = dlog.dl_buffer4_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF];
|
||||
break;
|
||||
}
|
||||
default: { //åñëè â buff_num ÷òî-òî íå òî, ïî-äåôîëòó ïóñòü ïåðâûé áóôåð
|
||||
dlog.next_value_var = dlog.dl_buffer1_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF];
|
||||
break;
|
||||
}
|
||||
}
|
||||
//äàííûå òîëüêî â íèæíåé ÷àñòè
|
||||
dlog.next_value_var &= 0xFFFF;
|
||||
dlog.next_value_var |= (((unsigned long) dlog.Rcounter) << 16); //â âåðõíåé ÷àñòè ñëîâà Rcounter äëß êîíòðîëß
|
||||
dlog.next_value_var |= (((unsigned long) dlog.buff_num) << 24); //â âåðõíåé ÷àñòè ñëîâà (åùå âûøå) buff_num äëß êîíòðîëß
|
||||
|
||||
dlog.Rcounter++; //êàêóþ òî÷êó îòäàåì. èíêðåìåíòèðóåòñß ñàìî ïîñëå ÷òåíèß òåêóùåé òî÷êè.
|
||||
dlog.Rcounter &= 0xFF; //ïî êðóãó. íè÷åãî ñòðàøíîãî, ïåðåä ÷òåíèåì îáíóëßþ. ñì. çàïèñü
|
||||
#endif
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
int32 val32;
|
||||
int varSizeIs16;
|
||||
switch (dlog.buff_num) { //òåêóùèé íîìåð áóôåðà
|
||||
default:
|
||||
case 0: {
|
||||
val32 = dlog.dl_buffer1_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF];
|
||||
varSizeIs16 = (int)(dlog.object1Info.varSize == 16);
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
val32 = dlog.dl_buffer2_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF];
|
||||
varSizeIs16 = (int)(dlog.object2Info.varSize == 16);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
val32 = dlog.dl_buffer3_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF];
|
||||
varSizeIs16 = (int)(dlog.object3Info.varSize == 16);
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
val32 = dlog.dl_buffer4_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF];
|
||||
varSizeIs16 = (int)(dlog.object4Info.varSize == 16);
|
||||
break;
|
||||
}
|
||||
}
|
||||
dlog.next_value_var = (dlog.highPartOfValue != 0 ? val32 >> 16 : val32) & 0x0000FFFF;
|
||||
dlog.next_value_var |= ((Uint32)dlog.Rcounter) << 16;
|
||||
dlog.next_value_var |= ((Uint32)dlog.buff_num) << 24;
|
||||
dlog.next_value_var |= ((Uint32)dlog.highPartOfValue) << 26;
|
||||
dlog.next_value_var |= ((Uint32)varSizeIs16) << 27;
|
||||
|
||||
if ((dlog.highPartOfValue != 0) || varSizeIs16)
|
||||
{
|
||||
// Ïðè ñëåäóþùåì çàïðîñå îòäàäèì ìëàäøóþ ÷àñòü ñëåäóþùåé òî÷êè.
|
||||
dlog.Rcounter++;
|
||||
dlog.Rcounter &= 0xFF;
|
||||
dlog.highPartOfValue = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Ïðè ñëåäóþùåì çàïðîñå îòäàäèì ñòàðøóþ ÷àñòü ýòîé æå òî÷êè.
|
||||
dlog.highPartOfValue = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
108
Vsrc/DRV_INTERFACE.c
Normal file
108
Vsrc/DRV_INTERFACE.c
Normal file
@ -0,0 +1,108 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file DRV_INTERFACE.c
|
||||
\brief ×åðåç äàííûå ìîäóëü îáåñïå÷èâàåòñß ðàáîòà ñ áàíêîì àâàðèé (÷òåíèå, î÷èñòêà).
|
||||
//Ïðåäïîëàãàåòñß, ÷òî ìîäóëü ìîæåò ðàñøèðßòü ôóíêöèîíàëüíîñòü (ñêà÷èâàòü êàèå-òî äðóãèå äàííûå)...
|
||||
//ÏÐÈÌÅ×ÀÍÈÅ äëÿ ïðîãðàììèñòà:
|
||||
1.äëÿ êîìàíä ðàáîòàþùèõ ïî ñåòè ñ àâòîìàòèçèðîâàííûìè ñèñòåìàìè (Þíèêîí,, ïóëüòû è ò.ä.) ïîñëå âûïîëíåíèÿ êîìàíäû ïîëå ans_data äîëæíî áûòü óñòàíîâëåíî çíà÷åíèåì çàïðîñà:
|
||||
p->ans_data = temp;
|
||||
÷òî ñîîáùèò âíåøíåé ñèñòåìå, ÷òî çàïðîñ îáðàáîòàí.  ýòîì ñëó÷àå ïîëå p->ans_data îáíóëÿåòñÿ âíåøíåé àâòîìàòèçèðîâàííîé ñèñòåìîé ïîñëå ñáîðà èíôîðìàöèè ñ ïîëåé
|
||||
p->data_Low
|
||||
p->data_High
|
||||
2.äëÿ âíóòðåííèõ âûçîâîâ ïîëå p->ans_data òðîãàòü íå íóæíî
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.1 2017_07_24
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include "main.h"
|
||||
void DRV_INTERFACE_Calc(TDrvInterface *p) {
|
||||
TEvent event;
|
||||
|
||||
long temp = (p->req_data); //ïðèíßòèå çàïðîñà
|
||||
|
||||
p->INTERFACE_delta_time_sec = global_time.relative_time1.second_counter - p->INTERFACE_time_sec;
|
||||
// ïðîâåðêà "óõîäà" îòâåòà
|
||||
if ((p->ans_data != 0) && (p->INTERFACE_delta_time_sec < DRV_INTERFACE_RESET_TIME))
|
||||
return;
|
||||
|
||||
//ðàç ñþäà ïîïàëè çíà÷èò ëèáî òàéìàóò äëß àíñà èñòåê, ëèáî îí íóëåâîé
|
||||
//â ëþáîì ñëó÷àå åãî îáíóëßåì
|
||||
p->ans_data = 0;
|
||||
//çàïðîñ îáíóëßåì òîëüêî ïîñëå âûïîëíåíèß, ÷òîáû âíåøíèå óñòðîéñòâà ìîãëè êîíòðîëèòü âûïîëíåíèå çàïðîñà
|
||||
switch ((temp) >> 16)
|
||||
{
|
||||
case DATA_REQUEST_READ_FAULT: //çàïðîñ íà ÷òåíèå îøèáêè
|
||||
{
|
||||
FaultLog.read(&FaultLog, (temp & 0x0FFFF), &event);
|
||||
//ôîðìèðóåì îòâåò
|
||||
p->data_Low = (((Uint32) (event.ev_num)) << 16) + event.ev_code;
|
||||
p->data_High = event.ev_time;
|
||||
|
||||
p->ans_data = temp; //ãîâîðèì Þíèêîíó, ÷òî êîìàíäà îáðàáîòàíà
|
||||
//ôèêñèðóåì âðåìß îòâåòà
|
||||
p->INTERFACE_time_sec = global_time.relative_time1.second_counter;
|
||||
break;
|
||||
}
|
||||
case DATA_REQUEST_WRITE_FAULT: //çàïðîñ íà çàïèñü îøèáêè
|
||||
{
|
||||
//!!!
|
||||
//ïîêà ÷åðåç èíòåðôåéñ ïèñàòü îøèáêó íåëüçß
|
||||
break;
|
||||
}
|
||||
case DATA_REQUEST_WRITE_WORK_TIME: //çàïðîñ íà çàïèñü work_time
|
||||
{
|
||||
global_time.relative_time1.relative_date.hour = 0;
|
||||
global_time.relative_time1.relative_date.minute = 0;
|
||||
global_time.WtiteSPI_flag = 1;
|
||||
|
||||
break;
|
||||
}
|
||||
case DATA_REQUEST_READ_WORK_TIME: //çàïðîñ íà ÷òåíèå work_time
|
||||
{
|
||||
//Ma][: Áó!
|
||||
break;
|
||||
}
|
||||
case DATA_REQUEST_WRITE_OPER_TIME: { //çàïðîñ íà çàïèñü oper_time
|
||||
global_time.relative_time2.relative_date.hour = 0;
|
||||
global_time.relative_time2.relative_date.minute = 0;
|
||||
global_time.WtiteSPI_flag = 1;
|
||||
|
||||
break;
|
||||
}
|
||||
case DATA_REQUEST_READ_OPER_TIME: //çàïðîñ íà ÷òåíèå îøèáêè
|
||||
{
|
||||
//Ma][: Áó!
|
||||
break;
|
||||
}
|
||||
case DATA_REQUEST_CLEAR_ALL: //çàïðîñ íà î÷èñòêó áàíêà àâàðèé
|
||||
{
|
||||
FaultLog.clear(&FaultLog);
|
||||
//ôîðìèðóåì îòâåò
|
||||
p->data_High = 0;
|
||||
p->data_Low = 0;
|
||||
|
||||
p->ans_data = temp; //ãîâîðèì Þíèêîíó, ÷òî êîìàíäà îáðàáîòàíà
|
||||
//ôèêñèðóåì âðåìß îòâåòà
|
||||
p->INTERFACE_time_sec = global_time.relative_time1.second_counter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
p->req_data = 0;//îáíóëßåì ïîëå çàïðîñà, ÷òîáû íå âûïîëíèòü åãî ïîâòîðíî
|
||||
}
|
||||
|
109
Vsrc/SM_CmdLogic.c
Normal file
109
Vsrc/SM_CmdLogic.c
Normal file
@ -0,0 +1,109 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMCmdLogic.c
|
||||
\brief Îáðàáîòêà êîìàíä è çàäàíèé, ïîñòóïàþùèõ èç ðàçëè÷íûõ èñòî÷íèêîâ. (ñì. TSM_CmdLogic)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup SMCmdLogic
|
||||
@{*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "V_IQmath.h"
|
||||
#include "main.h"
|
||||
|
||||
//!Èíèöèàëèçàöèÿ
|
||||
|
||||
//!Âñÿêèå îáíóëåíèÿ...
|
||||
//! \memberof TSM_CmdLogic
|
||||
void SM_CmdLogicInit(TSM_CmdLogic *p) {
|
||||
p->state = 0;
|
||||
p->state_prev = 0xFF;
|
||||
cmd.all = 0;
|
||||
|
||||
}
|
||||
|
||||
//!Ìåäëåííûé ðàñ÷åò
|
||||
|
||||
//! \memberof TSM_CmdLogic
|
||||
void SM_CmdLogicSlow_Calc(TSM_CmdLogic *p) {
|
||||
|
||||
}
|
||||
|
||||
//!1êÃö ðàñ÷åò
|
||||
|
||||
//!Îáðàáîòêà ðàçëè÷íûõ èñòî÷íèêîâ êîìàíä è ðàñ÷åò ÄÀ,
|
||||
//!êîòîðûé ïåðåêëþ÷àåò ãëîáàëüíî ðåæèìû ÐÀÁÎÒÀ è ÎÑÒÀÍÎÂ.
|
||||
//! \memberof TSM_CmdLogic
|
||||
void SM_CmdLogicms_Calc(TSM_CmdLogic *p) {
|
||||
|
||||
//Ñòàíäàðòíàÿ îáðàáîòêà äèñêðåòíîãî àâòîìàòà
|
||||
if (p->state_prev != p->state)
|
||||
p->E = 1;
|
||||
else
|
||||
p->E = 0;
|
||||
p->state_prev = p->state;
|
||||
|
||||
|
||||
//îïðåäåëÿåì ðåæèì ðàáîòû
|
||||
switch (p->state) {
|
||||
case CMD_LOGIC_TURNED_OFF: { //ñîñòîÿíèå 0- ÎÒÊËÞ×ÅÍ
|
||||
if (p->E == 1) {
|
||||
/*ENTRY*/
|
||||
sm_ctrl.state = CTRL_STOP;
|
||||
drv_status.bit.ready = 1;
|
||||
drv_status.bit.running = 0;
|
||||
}
|
||||
|
||||
if (sm_prot.state == PROT_ON_OK) {//åñëè ÄÀ çàùèò âêëþ÷èëñÿ, îáðàáàòûâàåì êîìàíäû âêëþ÷åíèÿ
|
||||
if ((cmd.bit.start == 1) && (sm_sys.state == SYS_READY))//åñòü áèòîâàÿ êîìàíäà ñòàðòà
|
||||
p->state = CMD_LOGIC_TURNED_ON; //ïîåõàëè
|
||||
}
|
||||
|
||||
//äèñêðåòíûé àâòîìàò ñî ñòðóêòóðàìè óïðàâëåíèÿ â ÑÒÎÏå âñåãäà òîæå ïðèíóäèòåëüíî ïåðåâîäèì â ñòîï
|
||||
sm_ctrl.state = CTRL_STOP;
|
||||
//âñåãäà ñáðàñûâàåì áèòîâûå êîìàíäû óïðàâëåíèÿ
|
||||
cmd.bit.stop = 0;
|
||||
cmd.bit.start = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case CMD_LOGIC_TURNED_ON: { //ñîñòîÿíèå - ÐÀÁÎÒÀ
|
||||
if (p->E == 1) {
|
||||
/*ENTRY*/
|
||||
drv_status.bit.ready = 1;
|
||||
drv_status.bit.running = 1;
|
||||
sm_ctrl.state = CTRL_RUN;//ïîåõàëè
|
||||
}
|
||||
//åñëè ÀÂÀÐÈÿ èëè ÊÎÌÀÍÄÀ ÑÒÎÏ òî ñîñòîÿíèå ñòîï
|
||||
if ((sm_prot.state == PROT_FAIL) || (cmd.bit.stop == 1)
|
||||
|| (sm_ctrl.state == CTRL_STOP)){
|
||||
p->state = CMD_LOGIC_TURNED_OFF;
|
||||
}
|
||||
|
||||
//âñåãäà ñáðàñûâàåì êîìàíäó óïðàâëåíèÿ
|
||||
cmd.bit.stop = 0;
|
||||
cmd.bit.start = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
} // êîíåö switch(p->state)
|
||||
}
|
||||
|
||||
/*@}*/
|
783
Vsrc/SM_Ctrl.c
Normal file
783
Vsrc/SM_Ctrl.c
Normal file
@ -0,0 +1,783 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMCtrl.c
|
||||
\brief Основной ДА переключения систем управления (см. TSM_Ctrl)
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup SMCtrl */
|
||||
/*@{*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "V_IQmath.h"
|
||||
#include "main.h"
|
||||
|
||||
|
||||
//!Инициализация
|
||||
//!Всякие обнуления
|
||||
//! \memberof TSM_Ctrl
|
||||
void SM_Ctrl_Init(TSM_Ctrl *p) {
|
||||
p->state_prev = 0xff;
|
||||
p->state = 0x00;
|
||||
}
|
||||
|
||||
//!Фоновый расчет
|
||||
|
||||
//! \memberof TSM_Ctrl
|
||||
void SM_Ctrl_Slow_Calc(TSM_Ctrl *p) {
|
||||
|
||||
}
|
||||
|
||||
//!Миллисекундный расчет
|
||||
|
||||
//! \memberof TSM_Ctrl
|
||||
void SM_Ctrl_ms_Calc(TSM_Ctrl *p) {
|
||||
|
||||
}
|
||||
|
||||
//!Быстрый расчет
|
||||
|
||||
//!Реализует все структуры управления (режимы работы), такие как
|
||||
//!Векторное управление, скалярное, режим постоянного тока и т.п.
|
||||
//!Здесь реализован основной ДА переключения систем управления.
|
||||
//!Кроме того, происходит расчет некоторых вспомогательных модулей.
|
||||
//!Можно сказать, здесь находится "ядро" всей системы управления,
|
||||
//!и именно в этой функции происходит непосредственное управление двигателем с
|
||||
//!использованием всех остальных модулей.
|
||||
|
||||
//! \memberof TSM_Ctrl
|
||||
void SM_Ctrl_Fast_Calc(TSM_Ctrl *p) {
|
||||
|
||||
//если система находится в перееинициализации,
|
||||
//то пропускаем контур управления
|
||||
if (sm_sys.state == SYS_INIT) {
|
||||
return;
|
||||
}
|
||||
|
||||
//если команда остановить, то переходим
|
||||
//в режим ОСТАНОВЛЕН
|
||||
if (cmd.bit.stop == 1)
|
||||
p->state = CTRL_STOP;
|
||||
// если есть авария, то переходим в стоп
|
||||
if (sm_prot.state == PROT_FAIL)
|
||||
p->state = CTRL_STOP;
|
||||
|
||||
//считаем дискретный автомат
|
||||
if (p->state_prev != p->state)
|
||||
p->E = 1;
|
||||
else
|
||||
p->E = 0;
|
||||
//нужно для дискретного автомата, определение
|
||||
//первого вхождения
|
||||
p->state_prev = p->state;
|
||||
|
||||
switch (p->state) {
|
||||
case CTRL_STOP: { //Состояние ОСТАНОВ
|
||||
if (p->E == 1) { //Если первое вхождение в состояние
|
||||
cmd.bit.start = 0;
|
||||
DPReCAP.speed = 0;
|
||||
DPReCAP.Ts = 0;
|
||||
DPReCAP.Tspeed = 0;
|
||||
global_time.WtiteSPI_flag = 1; //записать времЯ работы
|
||||
//при переходе в стоп и работающем
|
||||
//осциллографе переводим его в режим
|
||||
//однократной записи, чтобы зафиксир. возможную аварию.
|
||||
if (dlog.StartBits & (1 << 8)) //Если пользователь задал этот бит
|
||||
dlog.set_mode(1, &dlog); //запускаем осциллограф по этому событию
|
||||
|
||||
if (sm_prot.state==PROT_FAIL)//если мы перешли в стоп, а модуль защит в аварии
|
||||
if (dlog.mode_reset==2)//и даталоггер крутился
|
||||
dlog.mode_reset=1;//то остановим осц, пусть будет осца аварии
|
||||
}
|
||||
pwm.Off(&pwm); //Выкл ШИМ
|
||||
// refs.theta_elec=0;
|
||||
|
||||
//Обнуление всего опасного
|
||||
pwm.UalphaRef = 0;
|
||||
pwm.UbetaRef = 0;
|
||||
pwm.update(&pwm);
|
||||
pid_id.reset(&pid_id);
|
||||
pid_iq.reset(&pid_iq);
|
||||
pid_ia.reset(&pid_ia);
|
||||
pid_spd.reset(&pid_spd);
|
||||
pid_pos.reset(&pid_pos);
|
||||
cur_par.Is = 0;
|
||||
cur_par.power = 0;
|
||||
cur_par.speed = 0;
|
||||
// cur_par.ThetaRefCurr=0;
|
||||
|
||||
/* Конец */
|
||||
break;
|
||||
}
|
||||
|
||||
case CTRL_RUN: { //Состояние запуска
|
||||
if (p->E == 1) {
|
||||
/*ENTRY START*/
|
||||
drv_status.bit.running = 1;
|
||||
pwm.On(&pwm);//Включение модуля ШИМ
|
||||
p->ctrl_counter = 0;
|
||||
if (dlog.StartBits & (1 << 0)) //Если пользователь задал этот бит
|
||||
dlog.set_mode(1, &dlog); //запускаем осциллограф по этому событию
|
||||
/*ENTRY END*/
|
||||
}
|
||||
/*DO START*/
|
||||
|
||||
p->ctrl_counter++;
|
||||
|
||||
|
||||
if (p->run_mode == CTRL_RUN_U2F) {//скалярный режим
|
||||
p->state = CTRL_RUN_U2F;
|
||||
}
|
||||
if (p->run_mode == CTRL_FLUXING) {//режим удержания (постоянный ток)
|
||||
p->state = CTRL_FLUXING;
|
||||
}
|
||||
if (p->run_mode == CTRL_RUN_I2F) {//частотно-токовый режим (вращение вектора тока)
|
||||
p->state = CTRL_RUN_I2F;
|
||||
}
|
||||
if (p->run_mode == CTRL_RUN_VECTOR_SM) {//векторная СУ синхронной машины с двумя контурами
|
||||
p->state = CTRL_RUN_VECTOR_SM;
|
||||
}
|
||||
if (p->run_mode == CTRL_RUN_VECTOR_SM_ENCODER_POS) {//векторная СУ синхронной машины с обратной связью по энкодеру и контуром положения
|
||||
p->state = CTRL_RUN_VECTOR_SM_ENCODER_POS;
|
||||
}
|
||||
if (p->run_mode == CTRL_RUN_VECTOR_IM_ENCODER) {//векторная СУ синхронной машины с обратной связью по энкодеру и контуром положения
|
||||
p->state = CTRL_RUN_VECTOR_IM_ENCODER;
|
||||
}
|
||||
if (p->run_mode == CTRL_AUTO_SENSOR_TUNING) {//автоматическая настройка смещений в ДПР (частотно-токовая+доп. логика)
|
||||
p->state = CTRL_AUTO_SENSOR_TUNING;
|
||||
}
|
||||
|
||||
if (p->run_mode == CTRL_RUN_LATENCY_TEST) { // Режим измерения задержки между ШИМ и датчиками тока
|
||||
p->state = CTRL_RUN_LATENCY_TEST;
|
||||
}
|
||||
|
||||
/*DO END*/
|
||||
break;
|
||||
}
|
||||
|
||||
case CTRL_FLUXING: { //Режим постоянный ток
|
||||
if (p->E == 1) {
|
||||
/*ENTRY START*/
|
||||
pwm.On(&pwm);
|
||||
pid_id.ui_reg3 = 0; //сбрасывем интегральные каналы
|
||||
pid_iq.ui_reg3 = 0; //чтобы не накапливались
|
||||
pid_spd.ui_reg3 = 0;
|
||||
refs.theta_elec = 0;//заданный угол - 0. Но он есть в группе Задания, его можно менять на ходу!
|
||||
|
||||
if (dlog.StartBits & (1 << 1))
|
||||
dlog.set_mode(1, &dlog);
|
||||
/*ENTRY END*/
|
||||
}
|
||||
/*DO START*/
|
||||
|
||||
//два тока фаз из АЦП в модуль фазных преобразований
|
||||
clarke.as = adc.Imeas_a;
|
||||
clarke.bs = adc.Imeas_b;
|
||||
clarke.calc(&clarke);//расчет
|
||||
|
||||
//из фазных преобразований в координатные преобразования.
|
||||
//Поворачиваем вектор на заданный угол refs.theta_elec
|
||||
park.ds = clarke.ds;
|
||||
park.qs = clarke.qs;
|
||||
park.ang = refs.theta_elec;
|
||||
park.calc(&park);
|
||||
|
||||
//регулятор тока "как бы" оси d (на самом деле эта ось к двигателю к оси d не привязана, это свободная ось)
|
||||
pid_id.pid_ref_reg3 = refs.i_flux_ref; //задание на ток намагничивания
|
||||
pid_id.pid_fdb_reg3 = park.de;//обратная связь - то что пришло с фазных преобразований
|
||||
pid_id.calc(&pid_id);
|
||||
|
||||
//регулятор тока "как бы" оси q (на самом деле эта ось к двигателю к оси q не привязана, это свободная ось)
|
||||
pid_iq.pid_ref_reg3 = 0;//задание - ноль
|
||||
pid_iq.pid_fdb_reg3 = park.qe;park.de;//обратная связь - то что пришло с фазных преобразований
|
||||
pid_iq.calc(&pid_iq);
|
||||
|
||||
//обратные фазные преобразования.
|
||||
//Крутим вектор напряжения, который выдают регуляторы токов обратно на угол refs.theta_elec
|
||||
ipark.de = pid_id.pid_out_reg3;
|
||||
ipark.qe = pid_iq.pid_out_reg3;
|
||||
ipark.ang = refs.theta_elec;
|
||||
ipark.calc(&ipark);
|
||||
|
||||
//получившиеся задания напряжения по осям альфа и бета отправляем на модуль ШИМ
|
||||
pwm.UalphaRef = ipark.ds;
|
||||
pwm.UbetaRef = ipark.qs;
|
||||
pwm.update(&pwm);
|
||||
|
||||
//в наблюдаемые переменные - текущий амплитудный ток в статоре (обратная связь регулятора d)
|
||||
cur_par.Is = pid_id.pid_fdb_reg3;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case CTRL_RUN_U2F: { //Режим скалярное управление U(f)
|
||||
if (p->E == 1) {
|
||||
/*ENTRY START*/
|
||||
pwm.On(&pwm);
|
||||
rmp.output = 0;
|
||||
|
||||
if (dlog.StartBits & (1 << 2)) //Если пользователь задал этот бит осциллографирования
|
||||
dlog.set_mode(1, &dlog); //запускаем осциллограф по этому событию
|
||||
|
||||
/*ENTRY END*/
|
||||
}
|
||||
/*DO START*/
|
||||
//задание скорости на вход задатчика интенсивности
|
||||
rmp.input = refs.speed_ref;
|
||||
rmp.calc(&rmp);//расчет задатчика
|
||||
cur_par.speed = rmp.output; //скорость (частоту вращения) показываем в налюдаемых параметрах, которая задана
|
||||
|
||||
//угол refs.theta_elec - интеграл от скорости rmp.output.
|
||||
//Константа FAST_CALC_TS - период дискретизации
|
||||
//drv_params.freq_nom номинальная частота (базовый параметр частоты для относительных единиц измерения)
|
||||
refs.theta_elec += _IQmpy(_IQmpyI32(drv_params.freq_nom,FAST_CALC_TS),
|
||||
rmp.output);
|
||||
refs.theta_elec &= 0x00FFFFFF; //отсечение лишней верхней части, если угол больше единицы в IQ (360 градусов)
|
||||
//на вход кривой U/f подается текущая скорость (частота)
|
||||
vhz.freq = rmp.output;
|
||||
vhz.calc(&vhz);
|
||||
|
||||
//в модуль координатных преоразований подаем заданную амплитуду напряжения vhz.vout с модуля U/f
|
||||
//Используем фазные преобразования как "крутилку" вектора напряжения
|
||||
ipark.de = vhz.vout;
|
||||
ipark.qe = 0;
|
||||
ipark.ang = refs.theta_elec;
|
||||
ipark.calc(&ipark);
|
||||
|
||||
//получившиеся задания напряжения по осям альфа и бета отправляем на модуль ШИМ
|
||||
pwm.UalphaRef = ipark.ds;
|
||||
pwm.UbetaRef = ipark.qs;
|
||||
pwm.update(&pwm);
|
||||
|
||||
/*DO END*/
|
||||
break;
|
||||
}
|
||||
|
||||
case CTRL_RUN_I2F: { //Режим частотно-токового управления - вращающийся вектор тока.
|
||||
if (p->E == 1) {
|
||||
/*ENTRY START*/
|
||||
pid_id.ui_reg3 = 0; //сбрасывем интегральные каналы
|
||||
pid_iq.ui_reg3 = 0; //чтобы не накапливались
|
||||
pid_spd.ui_reg3 = 0;
|
||||
pid_id.pid_ref_reg3 = 0;
|
||||
pid_iq.pid_ref_reg3 = 0;
|
||||
|
||||
pwm.On(&pwm);//влючение ШИМ
|
||||
rmp.output = 0;
|
||||
if (dlog.StartBits & (1 << 3))
|
||||
dlog.set_mode(1, &dlog);
|
||||
/*ENTRY END*/
|
||||
}
|
||||
/*DO START*/
|
||||
{
|
||||
|
||||
//два тока фаз из АЦП в модуль фазных преобразований
|
||||
clarke.as = adc.Imeas_a;
|
||||
clarke.bs = adc.Imeas_b;
|
||||
clarke.calc(&clarke);
|
||||
|
||||
//текущий вектор тока - в наблюдаемые параметры (чтобы на него смотреть)
|
||||
cur_par.Ialpha = clarke.ds;
|
||||
cur_par.Ibeta = clarke.qs;
|
||||
|
||||
//задание скорости на вход задатчика интенсивности
|
||||
rmp.input = refs.speed_ref;
|
||||
rmp.calc(&rmp);//расчет задатчика
|
||||
|
||||
//угол refs.theta_elec - интеграл от скорости rmp.output.
|
||||
//Константа FAST_CALC_TS - период дискретизации
|
||||
//drv_params.freq_nom номинальная частота (базовый параметр частоты для относительных единиц измерения)
|
||||
refs.theta_elec += _IQmpy(
|
||||
_IQmpyI32(drv_params.freq_nom,FAST_CALC_TS), rmp.output);
|
||||
cur_par.ThetaRefCurr = refs.theta_elec;
|
||||
refs.theta_elec &= 0x00FFFFFF;//отсечение лишней верхней части, если угол больше единицы в IQ (360 градусов)
|
||||
|
||||
//текущий угол с датчика положения, переведенный в электрический из механического
|
||||
//cur_par.ThetaCurr = posspeedEqep.theta_elecContinouos;
|
||||
|
||||
//Текущий угол - заданный угол
|
||||
cur_par.ThetaCurr = refs.theta_elec;
|
||||
|
||||
//из фазных преобразований в координатные преобразования.
|
||||
//Поворачиваем вектор на заданный угол refs.theta_elec
|
||||
park.ds = clarke.ds;
|
||||
park.qs = clarke.qs;
|
||||
park.ang = refs.theta_elec;
|
||||
park.calc(&park);
|
||||
|
||||
//регулятор тока "как бы" оси d (на самом деле эта ось к двигателю к оси d не привязана, это свободная ось)
|
||||
pid_id.pid_ref_reg3 = refs.i_flux_ref;
|
||||
pid_id.pid_fdb_reg3 = park.de;
|
||||
pid_id.calc(&pid_id);
|
||||
|
||||
//регулятор тока "как бы" оси q (на самом деле эта ось к двигателю к оси q не привязана, это свободная ось)
|
||||
pid_iq.pid_ref_reg3 = 0;
|
||||
pid_iq.pid_fdb_reg3 = park.qe;
|
||||
pid_iq.calc(&pid_iq);
|
||||
|
||||
//обратные фазные преобразования.
|
||||
//Крутим вектор напряжения, который выдают регуляторы токов обратно на угол refs.theta_elec
|
||||
ipark.de = pid_id.pid_out_reg3;
|
||||
ipark.qe = pid_iq.pid_out_reg3;
|
||||
ipark.ang = refs.theta_elec;
|
||||
ipark.calc(&ipark);
|
||||
|
||||
//получившиеся задания напряжения по осям альфа и бета отправляем на модуль ШИМ
|
||||
pwm.UalphaRef = ipark.ds;
|
||||
pwm.UbetaRef = ipark.qs;
|
||||
pwm.update(&pwm);
|
||||
|
||||
//в наблюдаемые переменные - текущий амплитудный ток в статоре (обратная связь регулятора d)
|
||||
cur_par.Is = pid_id.pid_fdb_reg3;
|
||||
//и текущую частоту (скорость)
|
||||
cur_par.speed = rmp.output;
|
||||
|
||||
|
||||
/*DO END*/
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CTRL_RUN_VECTOR_SM: { //Датчиковая СУ для синхронной машины
|
||||
if (p->E == 1) {
|
||||
/*ENTRY START*/
|
||||
pwm.On(&pwm); //Включение ШИМ
|
||||
rmp.output = 0; //Обнуление задатчика интенсивности
|
||||
if (dlog.StartBits & (1 << 4)) //Если пользователь задал этот бит осциллографирования
|
||||
dlog.set_mode(1, &dlog); //Запуск осциллографа по этому событию
|
||||
/*ENTRY END*/
|
||||
}
|
||||
/*DO START*/
|
||||
{
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_HALL){ //В типе датчика выбран ДПР на элементах Холла
|
||||
cur_par.speed = DPReCAP.speed; //Текущая скорость - с ДПР
|
||||
refs.theta_elec = DPReCAP.Angle; //текущее угловое положение - с ДПР
|
||||
}
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_ENCODER){ //В типе датчика выбран ДПР на элементах Холла
|
||||
cur_par.speed = posspeedEqep.speed_elec; //Текущая скорость - с ДПР
|
||||
refs.theta_elec = posspeedEqep.theta_elec; //текущее угловое положение - с ДПР
|
||||
}
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_SSI){ //В типе датчика выбран ДПР цифровой с SSI интерфейсом
|
||||
cur_par.speed = SSI_Encoder.speed_elec; //Текущая скорость - с ДПР
|
||||
refs.theta_elec = SSI_Encoder.theta_elec; //текущее угловое положение - с ДПР
|
||||
}
|
||||
|
||||
cur_par.Is = pid_iq.pid_fdb_reg3; //Текущий ток статора - ток по оси q
|
||||
|
||||
//Преобразование токов из трехфазной системы координат в двухфазную
|
||||
clarke.as = adc.Imeas_a;
|
||||
clarke.bs = adc.Imeas_b;
|
||||
clarke.calc(&clarke);
|
||||
cur_par.Ialpha = clarke.ds;
|
||||
cur_par.Ibeta = clarke.qs;
|
||||
|
||||
// задание скорости от задатчика интенсивности (ЗИ)
|
||||
rmp.input = refs.speed_ref;
|
||||
rmp.calc(&rmp);//Расчет ЗИ
|
||||
|
||||
pid_spd.pid_ref_reg3 = rmp.output; //на воход регулятора скорости - выход ЗИ
|
||||
pid_spd.pid_fdb_reg3 = cur_par.speed; //обратная связь регулятора скорости - скорость ДПР
|
||||
|
||||
|
||||
pid_spd.pid_out_max = refs.Iq_ref; //Максимум выхода регулятора скорости - заданный ток
|
||||
|
||||
if (sw.recuperation_ena & 1) //если разрешена рекуперация
|
||||
pid_spd.pid_out_min = -refs.Iq_ref; //минимум рег. скор. - отрицательный ток
|
||||
else
|
||||
//иначе
|
||||
pid_spd.pid_out_min = 0; //нулевой ток не даст рекупераци при вращении в положительную сторону
|
||||
pid_spd.calc(&pid_spd); //расчет регулятора скорости
|
||||
|
||||
|
||||
cur_par.ThetaRefCurr = refs.theta_elec;
|
||||
refs.theta_elec &= 0x00FFFFFF; //Ограничение угла на 1.0 в формате 8.24
|
||||
|
||||
//Поворот токов фаз на угол refs.theta_elec
|
||||
park.ds = clarke.ds;
|
||||
park.qs = clarke.qs;
|
||||
park.ang = refs.theta_elec;
|
||||
park.calc(&park); //расчет преобразования координат
|
||||
|
||||
//задание рег. тока по оси q (оси момента) - выход регулятора скорости
|
||||
pid_iq.pid_ref_reg3 = pid_spd.pid_out_reg3;
|
||||
pid_iq.pid_fdb_reg3 = park.qe; //обратная связь рег. тока оси q - вычисленный ток по фазе q
|
||||
pid_iq.calc(&pid_iq); //расчет регулятора тока оси q
|
||||
|
||||
pid_id.pid_ref_reg3 = 0; //задание тока по оси d - оси возбудения
|
||||
pid_id.pid_fdb_reg3 = park.de; //обратная связь рег. тока оси d - вычисленный ток по фазе d
|
||||
pid_id.calc(&pid_id); //расчет регулятора тока оси d
|
||||
|
||||
//Обратный поворот на угол refs.theta_elec для
|
||||
//выходов регуляторов тока (напряжений по осям d и q)
|
||||
ipark.de = pid_id.pid_out_reg3;
|
||||
ipark.qe = pid_iq.pid_out_reg3;
|
||||
ipark.ang = refs.theta_elec;
|
||||
ipark.calc(&ipark); //расчет преобразования координат
|
||||
|
||||
//Задание напряжение на модуль ШИМ после преобразования координат
|
||||
pwm.UalphaRef = ipark.ds; //Ось альфа
|
||||
pwm.UbetaRef = ipark.qs; //Ось бета
|
||||
pwm.update(&pwm); //Расчет модуля ШИМ
|
||||
/*DO END*/
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CTRL_RUN_VECTOR_SM_ENCODER_POS: { //Датчиковая СУ с энкодером и с контуром положения
|
||||
if (p->E == 1) {
|
||||
/*ENTRY START*/
|
||||
pwm.On(&pwm); //Включение ШИМ
|
||||
rmp.output = 0; //Обнуление задатчика интенсивности
|
||||
if (dlog.StartBits & (1 << 4)) //Если пользователь задал этот бит осциллографирования
|
||||
dlog.set_mode(1, &dlog); //Запуск осциллографа по этому событию
|
||||
/*ENTRY END*/
|
||||
}
|
||||
/*DO START*/
|
||||
{
|
||||
cur_par.Is = pid_iq.pid_fdb_reg3; //Текущий ток статора - ток по оси q
|
||||
cur_par.speed = posspeedEqep.speed_elec; //Текущая скорость - с ДПР фильтрованная
|
||||
|
||||
//Преобразование токов из трехфазной системы координат в двухфазную
|
||||
clarke.as = adc.Imeas_a;
|
||||
clarke.bs = adc.Imeas_b;
|
||||
clarke.calc(&clarke);
|
||||
cur_par.Ialpha = clarke.ds;
|
||||
cur_par.Ibeta = clarke.qs;
|
||||
|
||||
|
||||
/* //Для демо-режима контура положения сделаем задание положения, изменяющегося по синусу
|
||||
//Как быстро менять задание - пусть управляется из переменной для отладки DebugW1
|
||||
|
||||
if (DebugW1!=0){//если какая-то скорость вращения задана
|
||||
p->AngleDemo+=(DebugW1>>10);//инкрементируем переменную
|
||||
if (p->AngleDemo>_IQ(2))//период равен 2, что в о.е. дает 360*2 градусов
|
||||
p->AngleDemo=0;
|
||||
|
||||
//задание угла в контур положения
|
||||
//пусть будет синус от линейно увеличивающейся переменной, да еще и в 4 раза увеличим
|
||||
refs.theta_elec=_IQsinPU(p->AngleDemo)<<2;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
//Другой демо-режим контура положения - задавать положение от двигателя датчика, абсолютного энкодера с интерфейсом SSI
|
||||
//Для работы датчика его нужно, собственно, подключить (в комплект поставки не входит!),
|
||||
//а также выбрать его в настройках
|
||||
|
||||
#define REVOLUTION_DROP_NUMBER 3
|
||||
//чтобы можно было вращать неограниченно в одну сторону и не переполнилась переменная по положению
|
||||
//но чтобы нельзя было накрутить 100500 оборотов вперед привода и он крутил бы дальше и дальше
|
||||
//ограничим максимальное расхождение в обототах числом REVOLUTION_DROP_NUMBER
|
||||
if (labs(SSI_Encoder.RevolutionCounter-posspeedEqep.RevolutionCounter)>REVOLUTION_DROP_NUMBER){
|
||||
if (posspeedEqep.RevolutionCounter>SSI_Encoder.RevolutionCounter){
|
||||
posspeedEqep.RevolutionCounter=SSI_Encoder.RevolutionCounter+REVOLUTION_DROP_NUMBER;
|
||||
}
|
||||
if (SSI_Encoder.RevolutionCounter>posspeedEqep.RevolutionCounter){
|
||||
SSI_Encoder.RevolutionCounter=posspeedEqep.RevolutionCounter+REVOLUTION_DROP_NUMBER;
|
||||
}
|
||||
}
|
||||
if ((posspeedEqep.RevolutionCounter>10) || (SSI_Encoder.RevolutionCounter>10)){
|
||||
posspeedEqep.RevolutionCounter-=10;
|
||||
SSI_Encoder.RevolutionCounter-=10;
|
||||
}
|
||||
if ((posspeedEqep.RevolutionCounter<-10) || (SSI_Encoder.RevolutionCounter<-10)){
|
||||
posspeedEqep.RevolutionCounter+=10;
|
||||
SSI_Encoder.RevolutionCounter+=10;
|
||||
}
|
||||
|
||||
//задание угла - от SSI энкодера
|
||||
refs.theta_elec=SSI_Encoder.theta_elecContinouos;
|
||||
*/
|
||||
|
||||
|
||||
//текущий угол с датчика положения, переведенный в электрический из механического
|
||||
cur_par.ThetaCurr = posspeedEqep.theta_elecContinouos;
|
||||
cur_par.ThetaRefCurr=refs.theta_elec;//заданный угол электрический (продублируем в эту переменную задание для удобства наблюдения)
|
||||
|
||||
//ошибка - разница между заданием и текущим углом. Эта разница обычно считается внутри ПИД регулятора,
|
||||
//однако в данном случае нужно после расчета произвести ограничение, чтобы в регуляторе ничего не переполнилось
|
||||
long posRefError=refs.theta_elec - cur_par.ThetaCurr;
|
||||
|
||||
|
||||
//ограничим ошибку - чтобы при расчете регулятора внутри него не было переполнения.
|
||||
if (posRefError>_IQ(1))
|
||||
posRefError=_IQ(1);
|
||||
if (posRefError<-_IQ(1))
|
||||
posRefError=-_IQ(1);
|
||||
|
||||
|
||||
//обычно на ПИД регулятор подается задание и обратная связь, а внутри считается их разница.
|
||||
//но разницу мы посчитали выше (и ограничили). Потому пусть задание на регулятор будет всё время нулевым,
|
||||
//а в обратную связь подадим уже посчитанную и ограниченную ошибку (со знаком минус)
|
||||
pid_pos.pid_ref_reg3 = 0;//задавать задание на положение надо через refs.theta_elec (группа задания)
|
||||
pid_pos.pid_fdb_reg3 = -posRefError;//обратная связь
|
||||
pid_pos.pid_out_max=refs.speed_ref;//ограничение рег. положения - максимум задаваемой скорости
|
||||
pid_pos.pid_out_min=-refs.speed_ref;//и в минус
|
||||
pid_pos.saterr_reg3Add=pid_spd.saterr_reg3;//это улучшайзер. Учитывает насыщение рег. скорости и передает его в рег. положения.
|
||||
pid_pos.calc(&pid_pos); //расчет регулятора положения
|
||||
|
||||
pid_spd.pid_ref_reg3 = pid_pos.pid_out_reg3; //на вход регулятора скорости - выход рег. положения
|
||||
pid_spd.pid_fdb_reg3 = posspeedEqep.speed_filter.output; //обратная связь регулятора скорости - скорость ДПР
|
||||
|
||||
pid_spd.pid_out_max = refs.Iq_ref; //Максимум выхода регулятора скорости - заданный ток
|
||||
pid_spd.pid_out_min = -refs.Iq_ref; //минимум рег. скор. - отрицательный ток
|
||||
pid_spd.calc(&pid_spd); //расчет регулятора скорости
|
||||
|
||||
|
||||
//Поворот токов фаз на угол refs.theta_elec
|
||||
park.ds = clarke.ds;
|
||||
park.qs = clarke.qs;
|
||||
park.ang = posspeedEqep.theta_elec;
|
||||
park.calc(&park); //расчет преобразования координат
|
||||
|
||||
//задание рег. тока по оси q (оси момента) - выход регулятора скорости
|
||||
pid_iq.pid_ref_reg3 = pid_spd.pid_out_reg3;
|
||||
pid_iq.pid_fdb_reg3 = park.qe; //обратная связь рег. тока оси q - вычисленный ток по фазе q
|
||||
pid_iq.calc(&pid_iq); //расчет регулятора тока оси q
|
||||
|
||||
pid_id.pid_ref_reg3 = 0; //задание тока по оси d - оси возбудения
|
||||
pid_id.pid_fdb_reg3 = park.de; //обратная связь рег. тока оси d - вычисленный ток по фазе d
|
||||
pid_id.calc(&pid_id); //расчет регулятора тока оси d
|
||||
|
||||
//Обратный поворот на угол refs.theta_elec для
|
||||
//выходов регуляторов тока (напряжений по осям d и q)
|
||||
ipark.de = pid_id.pid_out_reg3;
|
||||
ipark.qe = pid_iq.pid_out_reg3;
|
||||
ipark.ang = posspeedEqep.theta_elec;
|
||||
ipark.calc(&ipark); //расчет преобразования координат
|
||||
|
||||
//Задание напряжение на модуль ШИМ после преобразования координат
|
||||
pwm.UalphaRef = ipark.ds; //Ось альфа
|
||||
pwm.UbetaRef = ipark.qs; //Ось бета
|
||||
pwm.update(&pwm); //Расчет модуля ШИМ
|
||||
|
||||
/*DO END*/
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case CTRL_RUN_VECTOR_IM_ENCODER: { //Датчиковая СУ с энкодером
|
||||
if (p->E == 1) {
|
||||
/*ENTRY START*/
|
||||
pwm.On(&pwm); //Включение ШИМ
|
||||
RotorObserver.psi_d=0;
|
||||
RotorObserver.psi_q=0;
|
||||
rmp.output = 0; //Обнуление задатчика интенсивности
|
||||
if (dlog.StartBits & (1 << 4)) //Если пользователь задал этот бит осциллографирования
|
||||
dlog.set_mode(1, &dlog); //Запуск осциллографа по этому событию
|
||||
/*ENTRY END*/
|
||||
}
|
||||
/*DO START*/
|
||||
{
|
||||
cur_par.Is = _IQmag(pid_iq.pid_fdb_reg3,pid_id.pid_fdb_reg3) ; //Текущий ток статора - амплитуда из токов d и q
|
||||
cur_par.speed = posspeedEqep.speed_elec; //posspeedEqep.speed.output;//Текущая скорость - с ДПР фильтрованная
|
||||
|
||||
//Преобразование токов из трехфазной системы координат в двухфазную
|
||||
clarke.as = adc.Imeas_a;
|
||||
clarke.bs = adc.Imeas_b;
|
||||
clarke.calc(&clarke);
|
||||
cur_par.Ialpha = clarke.ds;
|
||||
cur_par.Ibeta = clarke.qs;
|
||||
|
||||
// задание скорости от задатчика интенсивности (ЗИ)
|
||||
rmp.input = refs.speed_ref;
|
||||
rmp.calc(&rmp);//Расчет ЗИ
|
||||
|
||||
pid_spd.pid_ref_reg3 = rmp.output; //на воход регулятора скорости - выход ЗИ
|
||||
pid_spd.pid_fdb_reg3 = posspeedEqep.speed_elec; //обратная связь регулятора скорости - скорость ДПР
|
||||
|
||||
|
||||
pid_spd.pid_out_max = refs.Iq_ref; //Максимум выхода регулятора скорости - заданный ток
|
||||
|
||||
if (sw.recuperation_ena & 1) //если разрешена рекуперация
|
||||
pid_spd.pid_out_min = -refs.Iq_ref; //минимум рег. скор. - отрицательный ток
|
||||
else
|
||||
//иначе
|
||||
pid_spd.pid_out_min = 0; //нулевой ток не даст рекупераци при вращении в положительную сторону
|
||||
pid_spd.calc(&pid_spd); //расчет регулятора скорости
|
||||
|
||||
|
||||
//Поворот токов фаз на угол refs.theta_elec
|
||||
park.ds = clarke.ds;
|
||||
park.qs = clarke.qs;
|
||||
park.ang = posspeedEqep.theta_elec;
|
||||
park.calc(&park); //расчет преобразования координат
|
||||
|
||||
RotorObserver.id=park.de;//на наблюдатель ротора АД - токи статора, повернутый на угол ДПРа
|
||||
RotorObserver.iq=park.qe;
|
||||
RotorObserver.calc(&RotorObserver);
|
||||
|
||||
refs.theta_elec = RotorObserver.theta_psi_elec+posspeedEqep.theta_elec; //текущее угловое положение - с ДПР и наблюдателя ротора (оси x,y)
|
||||
refs.theta_elec &= 0x00FFFFFF; //Ограничение угла на 1.0 в формате 8.24
|
||||
cur_par.ThetaRefCurr = refs.theta_elec;
|
||||
|
||||
|
||||
//Теперь refs.theta_elec - угол потокосцепления ротора. Повторяем векторную систему от синхронной машины для этого угла
|
||||
park.ds = clarke.ds;
|
||||
park.qs = clarke.qs;
|
||||
//второе слагаемое - доворот для устойчивости регуляторов на высокой скорости. Дублироваться второй раз для ipark не должен!
|
||||
park.ang = refs.theta_elec;
|
||||
park.calc(&park);
|
||||
|
||||
//регуляторы токов d, q используются для регулирования осей x, y (чтобы не делать разных названий)
|
||||
//задание рег. тока по оси y (оси момента) - выход регулятора скорости
|
||||
pid_iq.pid_ref_reg3 = pid_spd.pid_out_reg3;
|
||||
pid_iq.pid_fdb_reg3 = park.qe; //обратная связь рег. тока оси y - вычисленный ток по фазе y
|
||||
pid_iq.calc(&pid_iq); //расчет регулятора тока оси y
|
||||
|
||||
pid_id.pid_ref_reg3 = _IQmpy(RotorObserver.FluxCurrentRatio,labs(pid_iq.pid_ref_reg3)); //задание тока по оси x - оси возбудения. Пропорционально амплитуде задания тока статора
|
||||
if (pid_id.pid_ref_reg3 < RotorObserver.FluxCurrentMin)
|
||||
pid_id.pid_ref_reg3=RotorObserver.FluxCurrentMin;
|
||||
pid_id.pid_fdb_reg3 = park.de; //обратная связь рег. тока оси x - вычисленный ток по фазе x
|
||||
pid_id.calc(&pid_id); //расчет регулятора тока оси x
|
||||
|
||||
|
||||
//Обратный поворот на угол refs.theta_elec для
|
||||
//выходов регуляторов тока (напряжений по осям x и y)
|
||||
ipark.de = pid_id.pid_out_reg3;
|
||||
ipark.qe = pid_iq.pid_out_reg3;
|
||||
ipark.ang = refs.theta_elec;
|
||||
ipark.calc(&ipark); //расчет преобразования координат
|
||||
|
||||
//Задание напряжение на модуль ШИМ после преобразования координат
|
||||
pwm.UalphaRef = ipark.ds; //Ось альфа
|
||||
pwm.UbetaRef = ipark.qs; //Ось бета
|
||||
pwm.update(&pwm); //Расчет модуля ШИМ
|
||||
|
||||
/*DO END*/
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case CTRL_AUTO_SENSOR_TUNING: { //Авто настройка ДПР
|
||||
if (p->E == 1) {
|
||||
/*ENTRY START*/
|
||||
pwm.On(&pwm);
|
||||
rmp.output = 0;
|
||||
DPReCAP.AngleOffset = 0;
|
||||
if (dlog.StartBits & (1 << 3))
|
||||
dlog.set_mode(1, &dlog);
|
||||
/*ENTRY END*/
|
||||
}
|
||||
/*DO START*/
|
||||
{
|
||||
//по структуре это тоже самое, что частотно-токовая система управления
|
||||
cur_par.Is = pid_id.pid_fdb_reg3;
|
||||
cur_par.speed = rmp.output;
|
||||
|
||||
clarke.as = adc.Imeas_a;
|
||||
clarke.bs = adc.Imeas_b;
|
||||
clarke.calc(&clarke);
|
||||
cur_par.Ialpha = clarke.ds;
|
||||
cur_par.Ibeta = clarke.qs;
|
||||
|
||||
rmp.input = refs.speed_ref;
|
||||
rmp.calc(&rmp);
|
||||
refs.theta_elec += _IQmpy(
|
||||
_IQmpyI32(drv_params.freq_nom,FAST_CALC_TS), rmp.output);
|
||||
cur_par.ThetaRefCurr = refs.theta_elec;
|
||||
refs.theta_elec &= 0x00FFFFFF;
|
||||
|
||||
park.ds = clarke.ds;
|
||||
park.qs = clarke.qs;
|
||||
park.ang = refs.theta_elec;
|
||||
park.calc(&park);
|
||||
|
||||
pid_iq.pid_ref_reg3 = 0;
|
||||
pid_iq.pid_fdb_reg3 = park.qe;
|
||||
pid_iq.calc(&pid_iq);
|
||||
|
||||
pid_id.pid_ref_reg3 = refs.i_flux_ref;
|
||||
pid_id.pid_fdb_reg3 = park.de;
|
||||
pid_id.calc(&pid_id);
|
||||
|
||||
ipark.de = pid_id.pid_out_reg3;
|
||||
ipark.qe = pid_iq.pid_out_reg3;
|
||||
ipark.ang = refs.theta_elec;
|
||||
ipark.calc(&ipark);
|
||||
|
||||
pwm.UalphaRef = ipark.ds;
|
||||
pwm.UbetaRef = ipark.qs;
|
||||
|
||||
pwm.update(&pwm);
|
||||
|
||||
//автоматическая настрока смещения для датчика Холла
|
||||
if (p->AnglePrev != DPReCAP.Angle6) {
|
||||
if (((DPReCAP.Angle6 == _IQ(5.0 / 6.0)) && (p->AnglePrev == 0))
|
||||
|| ((p->AnglePrev == _IQ(5.0 / 6.0))
|
||||
&& (DPReCAP.Angle6 == 0))) {
|
||||
DPReCAP.AngleOffset =
|
||||
DPReCAP.AngleOffset
|
||||
+ _IQmpy(_IQ(0.5),
|
||||
((refs.theta_elec-DPReCAP.AngleOffset+_IQ(0.5))&0x00FFFFFF)-_IQ(0.5));
|
||||
DPReCAP.AngleOffset &= 0x00FFFFFF;
|
||||
}
|
||||
p->AnglePrev = DPReCAP.Angle6;
|
||||
}
|
||||
|
||||
//автоматическая настрока смещения для энкодера
|
||||
posspeedEqep.AngleOffset =
|
||||
posspeedEqep.AngleOffset
|
||||
+ _IQmpy(_IQ(0.0001),
|
||||
((refs.theta_elec-posspeedEqep.theta_elec+_IQ(0.5))&0x00FFFFFF)-_IQ(0.5));
|
||||
posspeedEqep.AngleOffset &= 0x00FFFFFF;
|
||||
/*DO END*/
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CTRL_RUN_LATENCY_TEST: { //Режим постоянный ток
|
||||
if (p->E == 1) {
|
||||
/*ENTRY START*/
|
||||
pwm.On(&pwm);
|
||||
p->ctrl_counter = 0;
|
||||
|
||||
if (dlog.StartBits & (1 << 1))
|
||||
dlog.set_mode(1, &dlog);
|
||||
/*ENTRY END*/
|
||||
}
|
||||
/*DO START*/
|
||||
p->ctrl_counter++;
|
||||
pwm.UalphaRef = 0;
|
||||
pwm.UbetaRef = 0;
|
||||
DebugW1++;
|
||||
if (p->ctrl_counter > 100){
|
||||
if (labs(adc.Imeas_a)< refs.i_flux_ref){
|
||||
pwm.UalphaRef = _IQ(1);
|
||||
pwm.UbetaRef = 0;
|
||||
} else {
|
||||
p->ctrl_counter = 0;
|
||||
}
|
||||
}
|
||||
|
||||
pwm.update(&pwm);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
157
Vsrc/SM_Net.c
Normal file
157
Vsrc/SM_Net.c
Normal file
@ -0,0 +1,157 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMNet.c
|
||||
\brief Ìîäóëü îáùåãî íàçíà÷åíèÿ äëÿ ðàáîòû ñ ñåòüþ. (ñì. TSM_Net)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup SMNet */
|
||||
/*@{*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "V_IQmath.h"
|
||||
#include "main.h"
|
||||
|
||||
//!Èíèöèàëèçàöèÿ.
|
||||
|
||||
//!Ïðèñâîåíèå ìàñøòàáèðóþùèõ êîýôôèöèåíòîâ, èíèöèàëèçàöèÿ äðóãèõ ìîäóëåé.
|
||||
//! \memberof TSM_Net
|
||||
void SM_Net_Init(TSM_Net *p) {
|
||||
|
||||
p->state = 0;
|
||||
p->state_prev = 0xff;
|
||||
|
||||
//Íàñòðîéêà äðàéâåðà CANOpen
|
||||
co1_vars.settings.LoadParamsFromUserMemory_ena = 1;//Ðàçðåøèòü çàãðóæàòü çíà÷åíèÿ ïàðàìåòðîâ èç ÝÍÎÇÓ
|
||||
co1_vars.CAN_REGS = (CAN_TypeDef *)CAN_BASE;//Ïåðåäàåì äðàéâåðó àäðåñ ñòðóêòóðû ðåãèñòðîâ CAN
|
||||
co1_vars.settings.CAN_ISR_priority = IRQ_PRIORITY_CAN;//Ïðèñâîåíèå ïðèîðèòåòà ïåðûâàíèÿ CAN (îáðàáîò÷èê âíóòðè áèáëèîòåêè)
|
||||
co1_vars.settings.CAN_IRQn = CAN1_IRQn;//Ïåðåäàåì íîìåð ïðåðûâàíèÿ CAN1 èç òàáëèöû ïðåðûâàíèé â äðàéâåð CANOpen
|
||||
co1_vars.settings.MultiPDO_ena = 0;//Îòêëþ÷åíèå îáðàáîòêè PDO áåç ó÷åòà íîìåðà óçëà (ñïåö. ôóíêöèÿ)
|
||||
co1_vars.settings.RX_PDO_Callback_ena = 0; //Íå âûçûâàòü ôóíêöèè îáðàòíîãî âûçîâà ïðè ïðèåìå PDO
|
||||
co1_vars.settings.AutoBusON_ena = 1; //Àâòîìàòè÷åñêè ïåðåçàïóñêàòü CAN ïðè îøèáêàõ íà ëèíèè
|
||||
co1_vars.settings.BlockTransfer_ena = 1;//Ðàçðåøèòü áëî÷íóþ ïåðåäà÷ó (íóæíà äëÿ îñöèëëîãðàôà)
|
||||
co1_vars.settings.speedCANTablePointer = &canSpeedTable;//Ïåðåäàåì äðàéâåðó ïàðàìåòðû äëÿ íàñòðîéêè ñêîðîñòè CAN
|
||||
co1_vars.settings.resetCPU = Watchdog.resetCPU;//Ïåðåäàåì äðàéâåðó àäðåñ ôóíêöèè ðåñåòà ìèêðîêîíòðîëëåðà
|
||||
co1_Init(&co1_vars); //Èíèöèàëèçàöèÿ äðàéâåðà CANOpen
|
||||
|
||||
//ëîããåð ñîáûòèé:
|
||||
// ðàçìåð áóôåðà: 50
|
||||
// ñòàðòîâûé àäðåñ â SPI: 3000
|
||||
FaultLog.init(&FaultLog, 50, 3000, (Uint32*)&RTCclock.packed_time);//íèæå óêàçàòåëü íà âðåìÿ ìîæåò áûòü ïåðåîïðåäåëåí â çàâèñèìîñòè îò ðàáîòû ÷àñîâ
|
||||
|
||||
|
||||
////Ðàáîòà ñ CANopen ÷åðåç UART (ïàðàëëåëüíî ñ CAN, íåò êîíôëèêòà)
|
||||
CANtoRS.nodeID = (Uint16*)&co1_vars.co_nodeID; //Íîìåð óçëà èç CANopen
|
||||
CANtoRS.callback = Z_co_receiveSDOrequest;//Óêàçàòåëü íà ôóíêöèþ îáðàòíîãî âûçîâà èç äðàéâåðà CANopen ïî ïðèõîäó SDO ñîîáùåíèÿ
|
||||
CANtoRS.init(&CANtoRS);
|
||||
}
|
||||
|
||||
//!Ìåäëåííûé ðàñ÷åò.
|
||||
|
||||
//! Ïðèñâîåíèå ìàñøòàáèðóþùèõ êîýôôèöèåíòîâ, ôîíîâûé ðàñ÷åò íåêîòîðûõ ìîäóëåé.
|
||||
|
||||
//! \memberof TSM_Net
|
||||
void SM_Net_Slow_Calc(TSM_Net *p) {
|
||||
|
||||
co1_vars.co_scaleNum0 = 1; //áåç ìàñøòàáèðîâàíèÿ
|
||||
co1_vars.co_scaleNum1 = 100; // %
|
||||
co1_vars.co_scaleNum2 = drv_params.freq_nom; //Ãö
|
||||
co1_vars.co_scaleNum3 = drv_params.U_nom;//íàïðÿæåíèå ôàçíîå íîìèíàëüíîå àìïëèòóäíîå
|
||||
co1_vars.co_scaleNum4 = drv_params.I_nom; //Òîê ôàçíûé áàçîâûé
|
||||
co1_vars.co_scaleNum5 = 1;
|
||||
co1_vars.co_scaleNum6 = 1;
|
||||
co1_vars.co_scaleNum7 = drv_params.Udc_nom; //íàïðÿæåíèå ÇÏÒ áàçîâîå
|
||||
co1_vars.co_scaleNum8 = drv_params.power; //18 â ôîðìàòå 9.6 //Ìîùíîñòü
|
||||
co1_vars.co_scaleNum9 = 1;
|
||||
co1_vars.co_scaleNumA = 20; //òåìïåðàòóðà
|
||||
co1_vars.co_scaleNumB = 1;
|
||||
co1_vars.co_scaleNumC = 1;
|
||||
co1_vars.co_scaleNumD = 1;
|
||||
co1_vars.co_scaleNumE = 1;
|
||||
co1_vars.co_scaleNumF = 1;
|
||||
co1_vars.co_scaleNum10 = 1; //
|
||||
co1_vars.co_scaleNum11 = 1; //
|
||||
co1_vars.co_scaleNum12 = drv_params.power; //18 â ôîðìàòå 10.6 //Ìîùíîñòü
|
||||
co1_vars.co_scaleNum13 = 360; //
|
||||
co1_vars.co_scaleNum14 = drv_params.speed_nom; //íîìèíàëüíàÿ ÷àñòîòà âðàùåíèÿ
|
||||
co1_vars.co_scaleNum15 = 1; //
|
||||
co1_vars.co_scaleNum16 = 1; //
|
||||
co1_vars.co_scaleNum17 = ((((long) drv_params.Udc_nom) << 6)
|
||||
/ (long) drv_params.I_nom); //Ráàç 10.6
|
||||
co1_vars.co_scaleNum18 = 1000;
|
||||
co1_vars.co_scaleNum19 = 1;
|
||||
co1_vars.co_scaleNum1A = 1;
|
||||
co1_vars.co_scaleNum1B = 1;
|
||||
co1_vars.co_scaleNum1C = 1;
|
||||
co1_vars.co_scaleNum1D = 1;
|
||||
co1_vars.co_scaleNum1E = 1;
|
||||
co1_vars.co_scaleNum1F = 1;
|
||||
|
||||
drv_params.U_nom = 0.5759 * drv_params.Udc_nom;//íîìèíàëüíîå ôàçíîå íàïðÿæåíèå
|
||||
drv_params.power = ((long) 300) << 6; //ïðèâåäåì ê ôîðìàòó 10.6
|
||||
drv_params.freq_nom = ((float) drv_params.speed_nom * drv_params.p) / 60 + 0.5; //íîìèí ÷àñòîòà
|
||||
|
||||
co_background_calc(&co1_vars); //Ðàñ÷åò äðàéâåðà CANOpen ôîíîâûé
|
||||
drv_interface.calc(&drv_interface);
|
||||
FaultLog.background_calc(&FaultLog);
|
||||
#ifdef MODBUS_ENA
|
||||
MBVarsConv.slow_calc(&MBVarsConv);
|
||||
#endif
|
||||
|
||||
if (RTCclock.ClockOk)//÷àñû ðàáîòàþò?
|
||||
FaultLog.time_ptr = (Uint32*)&RTCclock.packed_time;//âðåìÿ äëÿ áàíêà àâàðèé èç ÷àñîâ
|
||||
else
|
||||
FaultLog.time_ptr = (Uint32*)&global_time.PowerOn_time;//åñëè íå ðàáîòàþò, òî èç ìîäóëÿ ïîäñ÷åòà âðåìåíè íàðàáîòêè
|
||||
}
|
||||
|
||||
//!Áûñòðûé ðàñ÷åò
|
||||
|
||||
//!Áûñòðûé ðàñ÷åò íåêîòîðûõ ñåòåâûõ ìîäóëåé, âûçîâ ìåòîäîâ "ïðîëèñòûâàíèÿ" êîäîâ àâàðèé è ïðåäóïðåæäåíèé
|
||||
//! \memberof TSM_Net
|
||||
void SM_Net_ms_Calc(TSM_Net *p) {
|
||||
//Ïåðåâîä áèòîâîãî ñîñòîÿíèÿ ñèñòåìû óïðàâëåíèÿ â êîíñòàíòó.
|
||||
//Ïî drv_status_code îòîáðàæàåòñÿ ñòàòóñ ïðèâîäà â UniCON
|
||||
if (drv_status.bit.ready == 1)
|
||||
drv_status_code = DRV_STATUS_READY;
|
||||
if (drv_status.bit.running == 1)
|
||||
drv_status_code = DRV_STATUS_RUNNING;
|
||||
if (drv_status.bit.testing == 1)
|
||||
drv_status_code = DRV_STATUS_TESTING;
|
||||
if (drv_status.bit.fault == 1)
|
||||
drv_status_code = DRV_STATUS_FAULT;
|
||||
if (drv_status.bit.alarm == 1)
|
||||
drv_status_code |= DRV_STATUS_ALARM;
|
||||
else
|
||||
drv_status_code &= ~DRV_STATUS_ALARM;
|
||||
//ôóíêöèÿ ëèñòàíèÿ àâàðèé äëÿ ïóëüòà (UniCON)
|
||||
pult_faults_lister.calc(&pult_faults_lister);
|
||||
sm_prot.Main_ErrorCode = 0xFF & pult_faults_lister.output;
|
||||
|
||||
co_1ms_calc(&co1_vars); //Ðàñ÷åò äðàéâåðà CANOpen
|
||||
CANtoRS.calc(&CANtoRS);
|
||||
|
||||
}
|
||||
|
||||
void SM_Net_fast_Calc(TSM_Net *p) {
|
||||
|
||||
#ifdef MODBUS_ENA
|
||||
ModBus.Execute(&ModBus);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*@}*/
|
205
Vsrc/SM_Protect.c
Normal file
205
Vsrc/SM_Protect.c
Normal file
@ -0,0 +1,205 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMProtect.c
|
||||
\brief Ìîäóëü çàùèò. (ñì. TSM_Protect)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup SMProtect
|
||||
@{ */
|
||||
|
||||
#include "DSP.h"
|
||||
#include "main.h"
|
||||
#include "stdlib.h"
|
||||
|
||||
int16 WriteCounter = 0;
|
||||
|
||||
//!Èíèöèàëèçàöèÿ
|
||||
|
||||
//!Ïðèñâàèâàíèå âñÿêèõ ïåðåìåííûõ
|
||||
//! \memberof TSM_Protect
|
||||
void SM_Protect_Init(TSM_Protect *p) {
|
||||
p->state_prev = 0xff;
|
||||
p->state = 0x00;
|
||||
GPIOA->DENSET = (1 << 7);//äëÿ ïðèåìà íîæêè àïï. àâàðèè ðàçðåøàåì ðàáîòó íîæêè êàê öèôðû
|
||||
}
|
||||
|
||||
//! Áûñòðûé ðàñ÷åò.
|
||||
|
||||
//!Îáðàáàòûâàåò âñå àâàðèè è ïðè èõ âîçíèêíîâåíèè îñòàíàâëèâàåò ïðèâîä.
|
||||
//! \memberof TSM_Protect
|
||||
void SM_Protect_Fast_Calc(TSM_Protect *p) {
|
||||
|
||||
//àïïàðàòíàÿ àâàðèÿ îò èíâåðòîðà
|
||||
if (pwm.PDP_Fault) {
|
||||
if ((sm_ctrl.state != CTRL_STOP) && (sm_ctrl.state != CTRL_RUN))
|
||||
sm_prot.bit_fault1 |= F_PDPINT;
|
||||
}
|
||||
|
||||
if (!DRV_FAULT) {
|
||||
//èìååòñÿ êàêàÿ-òî àïïàðàòíàÿ àâàðèÿ
|
||||
sm_prot.bit_fault1 |= F_PDPINT;
|
||||
}
|
||||
|
||||
/*Çàùèòà ïî ìàêñèìàëüíîìó òîêó*/
|
||||
if (adc.Imeas_a > sm_prot.Imax_protect) sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_A;
|
||||
if (adc.Imeas_a < -sm_prot.Imax_protect) sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_A;
|
||||
if (adc.Imeas_b > sm_prot.Imax_protect) sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_B;
|
||||
if (adc.Imeas_b < -sm_prot.Imax_protect) sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_B;
|
||||
if (adc.Imeas_c > sm_prot.Imax_protect) sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_C;
|
||||
if (adc.Imeas_c < -sm_prot.Imax_protect) sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_C;
|
||||
|
||||
//ïðè ïðåâûøåíèè ñêîðîñòè âûøå àâàðèéíîé íîðìû
|
||||
if (labs(cur_par.speed) > sm_prot.speed_max) {
|
||||
sm_prot.bit_fault2 |= F_CTRL_SPEED_MAX; // ìàêñèììàëüíîå Ud
|
||||
}
|
||||
|
||||
//ïðè ïðåâûøåíèè íàïðÿæåíèÿ âûøå àâàðèéíîé íîðìû
|
||||
if (adc.Udc_meas > sm_prot.Umax_protect) {
|
||||
sm_prot.bit_fault1 |= F_CTRL_HI_UDC; // ìàêñèììàëüíîå Ud
|
||||
}
|
||||
|
||||
//ñíèæåíèå íàïðÿæåíèÿ
|
||||
if (adc.Udc_meas < sm_prot.Umin_protect) { //åñëè ïðèâîä ðàáîòàë òî ëîâèì àâàðèþ
|
||||
if (sm_ctrl.state != CTRL_STOP) {
|
||||
sm_prot.bit_fault1 |= F_CTRL_LOW_UDC;
|
||||
}
|
||||
}
|
||||
|
||||
DINT; //Çàïðåùåíèå ïðåðûâàíèé
|
||||
//Àâàðèè, òðåáóþùèå ïîëíîãî îñòàíîâà
|
||||
p->masked_bit_fault1 = p->bit_fault1 & p->mask_fault1;//ìàñêèðîâàíèå ôëàãîâ àâàðèé
|
||||
p->masked_bit_fault2 = p->bit_fault2 & p->mask_fault2;
|
||||
EINT; //Ðàçðåøåíèå ïðåðûâàíèé
|
||||
|
||||
|
||||
//ñ÷èòàåì äèñêðåòíûé àâòîìàò çàùèò
|
||||
if (p->state_prev != p->state) //ñìåíà ñîñòîÿíèÿ?
|
||||
p->E = 1;//Âîçâîäèì ôëàã ïåðâîãî âõîæäåíèÿ "entry"
|
||||
else
|
||||
p->E = 0;//èíà÷å ñáðàñûâàåì
|
||||
p->state_prev = p->state;
|
||||
|
||||
switch (p->state) {//â çàâèñèìîñòè îò òåêóùåãî ñîñòîÿíèÿ
|
||||
case PROT_OFF: { //Çàùèòà âûêëþ÷åíà
|
||||
if (p->E == 1) { //Ïåðâîå âõîæäåíèå
|
||||
}
|
||||
|
||||
//Îáíóëÿåì âñå àâàðèè
|
||||
p->bit_fault1 = 0;
|
||||
p->bit_fault2 = 0;
|
||||
|
||||
//Ïðîïóñêàåì íåêîòîðûé òàéìàóò ïîñëå âêëþ÷åíèÿ êîíòðîëëåðà
|
||||
//÷òîáû íå ëîâèòü ëîæíûå ñðàáàòûâàíèÿ àâàðèé ÀÖÏ
|
||||
if (p->powered_okCounter++ > 5000) {
|
||||
p->state = PROT_ON_OK;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PROT_ON_OK: { //Íîðìà
|
||||
if (p->E == 1) { //Ïåðâîå âõîæäåíèå
|
||||
drv_status.bit.fault = 0;
|
||||
}
|
||||
//åñòü àâàðèè?
|
||||
if ((p->masked_bit_fault1 | p->masked_bit_fault2) != 0) {
|
||||
p->state = PROT_FAIL; //ïåðåõîäèì â ñîñòîÿíèå àâàðèè
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PROT_FAIL: { //ñîñòîÿíèå àâàðèè (ñðàáîòàëà çàùèòà)
|
||||
if (p->E == 1) {
|
||||
cmd.all = 0;
|
||||
}
|
||||
drv_status.bit.fault = 1;
|
||||
//Âûêëþ÷åíèå ØÈÌ. Ïîêà òàì âñå îñòàëüíûå äèñêðåòíûå àâòîìàòû ïðîáóðëÿòñÿ, ÷òîáû èõ íå æäàòü
|
||||
pwm.Off(&pwm);
|
||||
//ëîãèêà ñáîðîñà àâàðèè
|
||||
if (cmd.bit.trip_reset == 1) {//êîìàíäà íà ñáðîñ àâàðèè
|
||||
p->state = PROT_ON_OK;//èäåì â "íîðìà"
|
||||
p->clearDrvFault = 1; //îòïðàâèòü äðàéâåðó êëþ÷åé êîìàíäó ñáðîñà
|
||||
//îáíóëÿåì âñå ôëàãè àâàðèé
|
||||
p->bit_fault1 = 0;
|
||||
p->bit_fault2 = 0;
|
||||
cmd.all = 0;//êîìàíäíîå ñëîâî
|
||||
//â ñàìîì íèçó!!! ïûòàåìñÿ ñáðîñèòü ôëàã pdp àïïàðàòíûé
|
||||
//åñëè àâàðèÿ âñå åùå èìååòñÿ, òî ñðàçó ïðîèçîéäåò ïðåðûâàíèå
|
||||
//è âîçâåäåòñÿ ôëàã àâàðèè
|
||||
if (PWM0->TZFLG_bit.OST == 1) { //èìååòñÿ ôëàã àïïàðàòíîé àâàðèè
|
||||
//ôëàã ìîæíî ñáðàñûâàòü
|
||||
PWM0->TZCLR = 0x7;
|
||||
PWM1->TZCLR = 0x7;
|
||||
PWM2->TZCLR = 0x7;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//! \memberof TSM_Protect
|
||||
void SM_Protect_ms_Calc(TSM_Protect *p) {
|
||||
if (WriteCounter <= 15) //åñëè ïåðâîå ñëîâî
|
||||
{
|
||||
if (((sm_prot.masked_bit_fault1 >> WriteCounter) & 0x1) != 0) //ñòîèò ii-é ôëàã àâàðèè
|
||||
{
|
||||
if (((sm_prot.bit_fault_written1 >> WriteCounter) & 0x1) == 0) //è îíà íå çàïèñàíà
|
||||
{
|
||||
FaultLog.write(&FaultLog, WriteCounter + 1);
|
||||
sm_prot.bit_fault_written1 |= (1 << WriteCounter);
|
||||
}
|
||||
}
|
||||
else
|
||||
sm_prot.bit_fault_written1 &= ~(1 << WriteCounter);
|
||||
}
|
||||
else if (WriteCounter <= 31) //âòîðîå ñëîâî
|
||||
{
|
||||
if (((sm_prot.masked_bit_fault2 >> (WriteCounter - 16)) & 0x1) != 0) //ñòîèò ii-é ôëàã àâàðèè
|
||||
{
|
||||
if (((sm_prot.bit_fault_written2 >> (WriteCounter - 16)) & 0x1) == 0) //è îíà òîëüêî ÷òî ïîßâèëàñü
|
||||
{
|
||||
FaultLog.write(&FaultLog, WriteCounter + 1);
|
||||
sm_prot.bit_fault_written2 |= (1 << (WriteCounter - 16));
|
||||
}
|
||||
}
|
||||
else
|
||||
sm_prot.bit_fault_written2 &= ~(1 << (WriteCounter - 16));
|
||||
}
|
||||
WriteCounter++;
|
||||
if (WriteCounter >= (33 - 1))
|
||||
WriteCounter = 0;
|
||||
}
|
||||
|
||||
//! Ìåäëåííûé ðàñ÷åò.
|
||||
|
||||
//! \memberof TSM_Protect
|
||||
void SM_Protect_Slow_Calc(TSM_Protect *p) {
|
||||
/* Ïðîâåðêà àïïàðàòíûõ çàùèò äðàéâåðà. Îí àâòîìàòè÷åñêè âûðóáàåò êëþ÷è ïðè àâàðèÿõ,
|
||||
* è îïóñêàåò ñèãíàëû /FAULT è /OCTW, íî ÷òîáû ïîíÿòü, ÷òî èìåííî ñëó÷èëîñü, íàäî ïî SPI ïðî÷èòàòü ñòàòóñû.
|
||||
* Ïîýòîìó, âèäèìî, ìîæíî â ôîíå.
|
||||
*/
|
||||
if (p->readDrvSts == 1) {
|
||||
p->readDrvSts = 0;
|
||||
}
|
||||
|
||||
/* ×òîáû ñáðîñèòü àâàðèþ, íàäî ïðîïèñàòü åìó áèòèê GATE_RESET */
|
||||
if (p->clearDrvFault == 1) {
|
||||
p->clearDrvFault = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*@}*/
|
278
Vsrc/SM_Sys.c
Normal file
278
Vsrc/SM_Sys.c
Normal file
@ -0,0 +1,278 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file SMSys.c
|
||||
\brief Модуль-обертка для расчета остальных модулей. (см. TSM_Sys)
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup SMSys */
|
||||
/*@{*/
|
||||
#include "main.h"
|
||||
|
||||
/* Объявление адреса размещения таблицы векторов прерываний */
|
||||
#if defined ( __CMCPPARM__ )
|
||||
extern const Uint32 __Vectors;
|
||||
#elif defined (__GNUC__)
|
||||
|
||||
#endif
|
||||
|
||||
//! Инициализация системы управления после включения
|
||||
|
||||
//!Инициализация некоторых модулей и настройка прерываний системы.
|
||||
//!Здесь настраивается большинство прерываний
|
||||
//! \memberof TSM_Sys
|
||||
void SM_Sys_Init(TSM_Sys *p) {
|
||||
#if defined (HW_VECTORCARD_DRV8301_EVM)
|
||||
sw.HardwareType = 0;
|
||||
#elif defined (HW_VECTORCARD_DRV8312_EVM)
|
||||
sw.HardwareType = 1;
|
||||
#elif defined (HW_VECTORCARD_SIMULATOR)
|
||||
sw.HardwareType = 2;
|
||||
#endif
|
||||
cmd.all = 0;
|
||||
drv_status.all = 0;
|
||||
|
||||
sm_net.init(&sm_net); //Сетевая часть
|
||||
adc.init(&adc); //Инициализация АЦП
|
||||
sm_prot.init(&sm_prot); //Защиты
|
||||
sm_cmd_logic.init(&sm_cmd_logic); //Логика включения/выключения
|
||||
sm_ctrl.init(&sm_ctrl); //Структура системы управления
|
||||
pwm.init(&pwm); //Модуль ШИМ
|
||||
cur_par.init(&cur_par); //Расчет текущих показателей привода
|
||||
leds.init(&leds);//светодиоды
|
||||
|
||||
//глобальное времЯ (внешние или внутр. часы)
|
||||
global_time.init(&global_time);
|
||||
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_HALL){ //В типе датчика выбран ДПР на элементах Холла
|
||||
// DPReCAP.Init(&DPReCAP); //ДПР иниц.
|
||||
}
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_ENCODER){ //В типе датчика выбран энкодер
|
||||
//настроим квадратурный декодер
|
||||
posspeedEqep.speed_nom = drv_params.speed_nom; //базовая скорость
|
||||
posspeedEqep.pole_pairs = drv_params.p; //кол-во пар полюсов дригателя
|
||||
posspeedEqep.Posspeed_CTL.bit.dir = 1; //направление движения
|
||||
posspeedEqep.RevolutionCounter=0;
|
||||
posspeedEqep.init(&posspeedEqep);//инициализация модуля энкодера
|
||||
}
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_SSI){ //В типе датчика выбран датчик с SSI интерфейсом. Читайте заголовочник модуля перед использованием!
|
||||
//настроим модуль датчика положения SSI
|
||||
SSI_Encoder.speed_nom = drv_params.speed_nom; //базовая скорость
|
||||
SSI_Encoder.pole_pairs = drv_params.p; //кол-во пар полюсов дригателя
|
||||
SSI_Encoder.rotation_dir = 0; //направление движения
|
||||
SSI_Encoder.RevolutionCounter=0;
|
||||
SSI_Encoder.init(&SSI_Encoder);//Датчик положения SSI
|
||||
}
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_ENC_HALL){
|
||||
//настроим квадратурный декодер
|
||||
// DPReCAP.Init(&DPReCAP); //ДПР иниц.
|
||||
posspeedEqep.speed_nom = drv_params.speed_nom; //базовая скорость
|
||||
posspeedEqep.pole_pairs = drv_params.p; //кол-во пар полюсов дригателя
|
||||
posspeedEqep.Posspeed_CTL.bit.dir = 1; //направление движения
|
||||
posspeedEqep.RevolutionCounter=0;
|
||||
posspeedEqep.init(&posspeedEqep);//инициализация модуля энкодера
|
||||
}
|
||||
|
||||
//листалка аварий для отображения на пульте управления (UniCON)
|
||||
pult_faults_lister.num_of_words = 2;
|
||||
pult_faults_lister.out_refresh_devisor = 1000; //при вызове в мс таймере период обновления будет равен 1сек
|
||||
pult_faults_lister.w_ptrs[0] = (Uint16*) &sm_prot.masked_bit_fault1;//перебираются эти флаги аварий модуля защит
|
||||
pult_faults_lister.w_ptrs[1] = (Uint16*) &sm_prot.masked_bit_fault2;
|
||||
|
||||
AutoOffset.FilterK = _IQ(0.00001);//постоянная времени фильтра для автосмещения АЦП
|
||||
AutoOffset.init(&AutoOffset); //авто смещение некоторых каналов АЦП (токи)
|
||||
|
||||
#if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR)
|
||||
//model.motorInternals.udc = 540; //задается через словарь объектов
|
||||
model.tpr = _IQ10div(_IQ10(SystemCoreClock/1000.0), pwm.Frequency << 1) >> 10; //период частоты ШИМ
|
||||
model.dt = _IQ4mpy(_IQ4(150 / 4), pwm.DeadBand >> 20) >> 4; //величина мертвого времени
|
||||
model.Init(&model); //Модель двигателя
|
||||
#endif
|
||||
|
||||
// Настройка таймера 0 на 10 кГц
|
||||
TMR0->INTSTATUS_bit.INT = 1;
|
||||
TMR0->LOAD_bit.VAL = 10000 - 1; //9999 надо чтобы не плыло отностильно прерывания ШИМа, когда у того частота 10кГц
|
||||
TMR0->CTRL = ((1 << 0) | (1 << 3)); // Запуск и разрешение прерываний
|
||||
|
||||
// Настройка таймера 1 на 1 кГц
|
||||
TMR1->INTSTATUS_bit.INT = 1;
|
||||
TMR1->LOAD_bit.VAL = 100000 - 1;
|
||||
TMR1->CTRL = ((1 << 0) | (1 << 3)); // Запуск и разрешение прерываний
|
||||
|
||||
//Для подсчета тактов
|
||||
TMR2->LOAD_bit.VAL = 0xFFFFFFFF;
|
||||
TMR2->CTRL = (1 << 0); // Запуск
|
||||
|
||||
extern int *g_pfnVectors; //там, где-то в стартап файле есть такой символ
|
||||
//Надо показать в этом регистре, где лежит таблица прерываний.
|
||||
//А лежит она там, куда записал её линкер, в зависимости от файла компоновки.
|
||||
//Поэтому берем адрес от массива g_pfnVectors и кладем туда
|
||||
#if defined (__CMCPPARM__)
|
||||
SCB->VTOR = (uint32_t) (&__Vectors);
|
||||
#elif defined (__GNUC__)
|
||||
extern int *g_pfnVectors;
|
||||
SCB->VTOR = (uint32_t) (&g_pfnVectors);
|
||||
#endif
|
||||
NVIC_SetPriorityGrouping(3); // 4 bit preemption, 0 bit of subprio
|
||||
|
||||
NVIC_DisableIRQ(TMR0_IRQn);
|
||||
NVIC_DisableIRQ(TMR1_IRQn);
|
||||
NVIC_DisableIRQ(ECAP0_IRQn);
|
||||
NVIC_DisableIRQ(ECAP1_IRQn);
|
||||
NVIC_DisableIRQ(ECAP2_IRQn);
|
||||
NVIC_DisableIRQ(PWM0_TZ_IRQn);
|
||||
NVIC_DisableIRQ(QEP_IRQn);
|
||||
|
||||
NVIC_ClearPendingIRQ(TMR0_IRQn);
|
||||
NVIC_ClearPendingIRQ(TMR1_IRQn);
|
||||
NVIC_ClearPendingIRQ(ECAP0_IRQn);
|
||||
NVIC_ClearPendingIRQ(ECAP1_IRQn);
|
||||
NVIC_ClearPendingIRQ(ECAP2_IRQn);
|
||||
NVIC_ClearPendingIRQ(PWM0_TZ_IRQn);
|
||||
NVIC_ClearPendingIRQ(QEP_IRQn);
|
||||
|
||||
/* Прерывание 10 кГц */
|
||||
NVIC_EnableIRQ(TMR0_IRQn);
|
||||
NVIC_SetPriority(TMR0_IRQn, IRQ_PRIORITY_10K);
|
||||
|
||||
/* Прерывание 1 кГц */
|
||||
NVIC_EnableIRQ(TMR1_IRQn);
|
||||
NVIC_SetPriority(TMR1_IRQn, IRQ_PRIORITY_1K);
|
||||
|
||||
NVIC_EnableIRQ(ECAP0_IRQn); //CAP0
|
||||
NVIC_SetPriority(ECAP0_IRQn, IRQ_PRIORITY_CAP);
|
||||
|
||||
NVIC_EnableIRQ(ECAP1_IRQn); //CAP1
|
||||
NVIC_SetPriority(ECAP1_IRQn, IRQ_PRIORITY_CAP);
|
||||
|
||||
NVIC_EnableIRQ(ECAP2_IRQn); //CAP2
|
||||
NVIC_SetPriority(ECAP2_IRQn, IRQ_PRIORITY_CAP);
|
||||
|
||||
NVIC_EnableIRQ(PWM0_TZ_IRQn); //PDP (в инверторе тексас нету такого пина)
|
||||
NVIC_SetPriority(PWM0_TZ_IRQn, IRQ_PRIORITY_TZ);
|
||||
|
||||
NVIC_EnableIRQ(QEP_IRQn); //QEP
|
||||
NVIC_SetPriority(QEP_IRQn, IRQ_PRIORITY_EQEP);
|
||||
|
||||
sm_sys.state = SYS_READY;
|
||||
|
||||
#ifdef WATCHDOG_ON
|
||||
Watchdog.enable(); //если сторожевой таймер используется, инициализируем
|
||||
#endif //WATCHDOG_ON
|
||||
}
|
||||
|
||||
|
||||
//!Быстрый расчет (обычно 10кГц).
|
||||
|
||||
//!Вызов быстрых расчетов модулей системы управления
|
||||
//! \memberof TSM_Sys
|
||||
void SM_Sys_Fast_Calc(TSM_Sys *p) {
|
||||
sm_net.fast_calc(&sm_net);//расчет коммуникационных драйверов
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_ENCODER) //В типе датчика выбран энкодер
|
||||
posspeedEqep.calc(&posspeedEqep); //ДПР энкодер
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_HALL){ //В типе датчика выбран ДПР Холла
|
||||
DPReCAP.AngleCalc(&DPReCAP); //ДПР Холл, интерполяция угла положения (результат в DPReCAP.Angle)
|
||||
DPReCAP.Angle6Calc(&DPReCAP); //ДПР Холл, получение угла с точнгстью 60 градусов (результат в DPReCAP.Angle6)
|
||||
DPReCAP.SpeedCalc(&DPReCAP); //ДПР Холл, расчет скорости вращения (DPReCAP.speed)
|
||||
DPReCAP.calc_10k(&DPReCAP); //ДПР Холл, служебные функции
|
||||
}
|
||||
if (drv_params.sens_type == POS_SENSOR_TYPE_SSI){ //Датчик с интерфейсом SSI. Перед употреблением читайте заголовочный файл!
|
||||
SSI_Encoder.calc(&SSI_Encoder);//Датчик положения SSI
|
||||
}
|
||||
|
||||
|
||||
|
||||
sm_prot.fast_calc(&sm_prot); //Защиты
|
||||
sm_ctrl.fast_calc(&sm_ctrl); //Главный дискретный автомат системы управления
|
||||
|
||||
global_time.calc(&global_time);
|
||||
|
||||
cur_par.calc(&cur_par); //Расчет текущих показателей привода
|
||||
drv_params.sens_type = drv_params.sens_type & 3; //Отсекаем верхнюю часть переменной, там мусор
|
||||
|
||||
#ifdef WATCHDOG_ON
|
||||
// Watchdog.feed();//если сторожевой таймер используется, сбрасываем его здесь
|
||||
#endif //WATCHDOG_ON
|
||||
}
|
||||
|
||||
//!Миллисекундный расчет 1кГц.
|
||||
|
||||
//!Вызов расчетов модулей системы управления, требующих миллисекундной дискретизации
|
||||
//! \memberof TSM_Sys
|
||||
void SM_Sys_ms_Calc(TSM_Sys* p) {
|
||||
sm_cmd_logic.ms_calc(&sm_cmd_logic); //Обработка команд управления
|
||||
sm_net.ms_calc(&sm_net); //обертка для вызова коммуникационных драйверов
|
||||
adc.ms_calc(&adc); //АЦП
|
||||
sm_prot.ms_calc(&sm_prot); //Защиты
|
||||
AutoOffset.ms_calc(&AutoOffset); //авто смещение некоторых каналов АЦП
|
||||
//блочная передача драйвера CANopen. Через неё, в частности, грузятся осциллограммы dlog
|
||||
// Can2BTInterface.ms_calc(&Can2BTInterface, TMR2->VALUE, &co2_vars);
|
||||
leds.msCalc(&leds);//светодиоды
|
||||
RTCclock.msCalc(&RTCclock);//часы
|
||||
UserMem.ms_calc(&UserMem);//пользовательская память в МК
|
||||
if ((drv_params.sens_type == 2) || (drv_params.sens_type == 3)){ //В типе датчика выбран ДПР Холла
|
||||
DPReCAP.ms_calc(&DPReCAP);
|
||||
}
|
||||
global_time.ms_calc(&global_time);
|
||||
}
|
||||
|
||||
//!Медленный расчет (фоновый).
|
||||
|
||||
//!Вызов медленных расчетов остальных модулей
|
||||
//! \memberof TSM_Sys
|
||||
void SM_Sys_Slow_Calc(TSM_Sys *p) {
|
||||
// Can2BTInterface.slow_calc(&Can2BTInterface);//интерфейс блочной передачи CANopen, медленный расчет
|
||||
UserMem.slow_calc(&UserMem);//пользовательская память в МК
|
||||
RTCclock.slowCalc(&RTCclock);//часы реального времени
|
||||
sm_prot.slow_calc(&sm_prot);//модуль защит
|
||||
sm_net.slow_calc(&sm_net); //обертка для вызова коммуникационных драйверов
|
||||
dlog.background_analizer(&dlog); //фоновый обработчик модуля осциллографирования
|
||||
global_time.slow_calc(&global_time);
|
||||
rmp.slow_calc(&rmp); //пересчет интенсивности разгона из пользовтельской во внутреннее представление
|
||||
pwm.slow_calc(&pwm); //фоновый обработчик модуля ШИМ (пересчет пользовательских заданий)
|
||||
adc.slow_calc(&adc); //Фоновый обработчик АЦП
|
||||
cur_par.slow_calc(&cur_par); //Расчет текущих показателей привода
|
||||
AutoOffset.slow_calc(&AutoOffset);
|
||||
posspeedEqep.slow_calc(&posspeedEqep);//инициализация модуля энкодера
|
||||
RotorObserver.slow_calc(&RotorObserver);//наблюдатель потока ротора АД
|
||||
DPReCAP.slow_calc(&DPReCAP);//ДПР Холла
|
||||
|
||||
//Пересчет коэффициентов для масштабирования токов и напряжений
|
||||
drv_params._1_Udc_nom = _IQdiv(_IQ16(1), _IQ16(drv_params.Udc_nom));
|
||||
drv_params._1_I_nom = _IQdiv(_IQ16(1), _IQ16(drv_params.I_nom));
|
||||
drv_params._1_U_nom = _IQdiv(_IQ16(1), _IQ16(drv_params.U_nom));
|
||||
|
||||
if (sw.Reboot & 1) { //команда перезагрузки
|
||||
sw.Reboot = 0; //сбрасываем её
|
||||
if (sm_ctrl.state == CTRL_STOP) { //перезагружаемся только в останове
|
||||
//выполняем сброс проца
|
||||
//Перезагружает во флеш!
|
||||
Watchdog.resetCPU();
|
||||
}
|
||||
}
|
||||
|
||||
//вызов расчета смещения АЦП для токов фаз
|
||||
//Делаем расчет только в останове и отсутствии аварии
|
||||
if ((sw.AutoOffset & 1) && (sm_ctrl.state == CTRL_STOP)) AutoOffset.Enabled=1;
|
||||
else AutoOffset.Enabled=0;
|
||||
|
||||
|
||||
|
||||
}
|
||||
/*@}*/
|
||||
|
73
Vsrc/V_AutoOffset.c
Normal file
73
Vsrc/V_AutoOffset.c
Normal file
@ -0,0 +1,73 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_AutoOffset.c
|
||||
\brief Àâòîñìåùåíèå ÀÖÏ (ñì. TAutoOffset)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
@{
|
||||
*/
|
||||
|
||||
/** \addtogroup TAutoOffset */
|
||||
/*@{*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "v_IQmath.h"
|
||||
#include "V_adc.h"
|
||||
#include "V_AutoOffset.h"
|
||||
#include "V_common.h"
|
||||
|
||||
extern TAdcDrv adc;
|
||||
extern TDrvParams drv_params;
|
||||
|
||||
void AutoOffset_init(TAutoOffset *p) {
|
||||
p->FilterK = _IQ(0.001);
|
||||
}
|
||||
|
||||
void AutoOffset_calc(TAutoOffset *p) {
|
||||
//èíòåãðàòîðû äëÿ òîêîâ ôàç. Êîãäà ìîäóëü âûçûâàåòñÿ, òîêè äîëæíû áûòü íóëåâûìè.
|
||||
//åñëè ýòî íå òàê, òî èíòåãðàòîðû ïîéäóò ñ÷èòàòü
|
||||
p->IA_int = p->IA_int + _IQmpy(p->FilterK, adc.Imeas_a);
|
||||
p->IB_int = p->IB_int + _IQmpy(p->FilterK, adc.Imeas_b);
|
||||
p->IC_int = p->IC_int + _IQmpy(p->FilterK, adc.Imeas_c);
|
||||
}
|
||||
|
||||
void AutoOffset_slow_calc(TAutoOffset *p) {
|
||||
|
||||
long IA_pu;
|
||||
long IB_pu;
|
||||
long IC_pu;
|
||||
|
||||
if (p->Enabled){//åñëè ìîäóëü àâòîðàñ÷åòà ñìåùåíèÿ òîêîâ âêëþ÷åí
|
||||
//ïåðåñ÷èòûâàåì èç î.å. îáðàòíî â çíà÷åíèÿ ÀÖÏ
|
||||
IA_pu = -p->IA_int / (_IQ16mpy(adc.Imeas_a_gain, drv_params._1_I_nom));
|
||||
adc.Imeas_a_offset = IA_pu >> 1;
|
||||
|
||||
IB_pu = -p->IB_int / (_IQ16mpy(adc.Imeas_b_gain, drv_params._1_I_nom));
|
||||
adc.Imeas_b_offset = IB_pu >> 1;
|
||||
|
||||
IC_pu = -p->IC_int / (_IQ16mpy(adc.Imeas_c_gain, drv_params._1_I_nom));
|
||||
adc.Imeas_c_offset = IC_pu >> 1;
|
||||
} else {//ìîäóëü âûêëþ÷åí, èíèöèàëèçèðóåì èíòåãðàòîðû òåêóùèìè çíà÷åíÿìè ñìåùåíèé
|
||||
p->IA_int=-(((long)adc.Imeas_a_offset)<<1)*_IQ16mpy(adc.Imeas_a_gain, drv_params._1_I_nom);
|
||||
p->IB_int=-(((long)adc.Imeas_b_offset)<<1)*_IQ16mpy(adc.Imeas_b_gain, drv_params._1_I_nom);
|
||||
p->IC_int=-(((long)adc.Imeas_c_offset)<<1)*_IQ16mpy(adc.Imeas_c_gain, drv_params._1_I_nom);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
327
Vsrc/V_CANtoRS.c
Normal file
327
Vsrc/V_CANtoRS.c
Normal file
@ -0,0 +1,327 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file v_CANtoRS.c
|
||||
\brief Преобразователь посылок CAN в RS и обратно. Работает
|
||||
совместно с драйвером CANOpen
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup v_CANtoRS
|
||||
@{
|
||||
*/
|
||||
#include "DSP.h"
|
||||
#include "main.h"
|
||||
|
||||
|
||||
|
||||
//! \memberof TCANtoRS
|
||||
void CANtoRS_init(TCANtoRS *p) {
|
||||
|
||||
GPIOB->ALTFUNCSET = (1 << 8) + (1 << 9);
|
||||
GPIOB->DENSET = (1 << 8) + (1 << 9);
|
||||
|
||||
p->UART=UART1;//Используемый в драйвере номер UART (0, 1)
|
||||
|
||||
p->UART->CR_bit.UARTEN = 1; // Разрешить работу UART
|
||||
|
||||
// Настройка частоты в двух регистрах:
|
||||
// задание делителя частоты для получения BaudRate
|
||||
// Т.к. блок UART тактируется с частотой 25 МГц (так настроено в ините микроконтроллера),
|
||||
// то для получения частоты 57600 бит/с необходим
|
||||
// делитель 25000000 / (16 * 57600) = 27,126736111111111111111111111111
|
||||
// Целая часть I = 27
|
||||
// Дробная часть F = (int)( 0.126736111*64 + 0.5 ) = 8
|
||||
// Формулы см. в документации
|
||||
p->UART->IBRD_bit.DIVINT= 27;
|
||||
p->UART->FBRD_bit.DIVFRAC = 8;
|
||||
|
||||
|
||||
p->UART->LCRH_bit.SPS = 0; // Нет проверки четности
|
||||
p->UART->LCRH_bit.WLEN = 3; // Длина посылки 8 бит
|
||||
p->UART->LCRH_bit.FEN = 1; // Использовать FIFO
|
||||
p->UART->CR_bit.TXE = 1; // Разрешить приём
|
||||
p->UART->CR_bit.RXE = 1; // Разрешить передачу
|
||||
p->UART->LCRH_bit.STP2 = 0; // 1 стоп-бит
|
||||
|
||||
p->CounterWrongCRC=0;
|
||||
p->CounterRes=0;
|
||||
p->CounterSended=0;
|
||||
p->PacketInWait=0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! Из заданного для передачи массива функция формирует
|
||||
//!API пакет, а затем вызывает функцию
|
||||
//!побайтовой отправки
|
||||
|
||||
//! \memberof TCANtoRS
|
||||
Uint16 CANtoRS_SendP(Uint16* Data, int16 len, TCANtoRS *p) {
|
||||
volatile int16 i;
|
||||
Uint16 MyCRC;
|
||||
p->buf_out[0]=0x7E;
|
||||
for (i=0;i<len;i++)
|
||||
p->buf_out[i+1]=Data[i];
|
||||
MyCRC=CANtoRS_C_CRC(p,Data,len);
|
||||
p->buf_out[len+1]=MyCRC & 0xFF;//первый байт
|
||||
p->buf_out[len+2]=(MyCRC>>8) & 0xFF;//второй байт
|
||||
p->all_len=1+len+2;//полная длина=сигнатура+данные + контрольная сумма
|
||||
|
||||
i = 0;
|
||||
// Если буфер TX не заполнен, то отправляем все байты из буфера
|
||||
while ((p->UART->FR_bit.TXFF != 1) && (i < p->all_len)){
|
||||
p->UART->DR = p->buf_out[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define CRC_MAGIC_NUMBER 0xA001
|
||||
//! Функция считает контрольную сумму пакета
|
||||
//! и сравнивает с принятой. Если все верно, то возвращает 1
|
||||
//! \memberof TCANtoRS
|
||||
|
||||
Uint16 CANtoRS_C_CRC(TCANtoRS *p,Uint16 *Data,Uint16 len) { //проверка контрольной суммы принятого API пакета
|
||||
int16 i,j;
|
||||
Uint16 MyCalcCRC=0xFFFF;
|
||||
|
||||
for (j=0;j<len;j++) {
|
||||
MyCalcCRC=MyCalcCRC^(Data[j++]&0xFF);
|
||||
for (i=0; i<16; i++)
|
||||
if (MyCalcCRC&0x01) {
|
||||
MyCalcCRC=(MyCalcCRC>>1);
|
||||
MyCalcCRC=MyCalcCRC^CRC_MAGIC_NUMBER;
|
||||
} else
|
||||
MyCalcCRC=(MyCalcCRC>>1);
|
||||
}
|
||||
|
||||
return MyCalcCRC;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*! Функция вызывается, когда пришли какие-то данные,
|
||||
и обрабатывает их как переданный CAN пакет. Выделяет
|
||||
идентификатор, длину и прочее. Рез-т помещает в структуру
|
||||
p->MSG */
|
||||
//! \memberof TCANtoRS
|
||||
void CANtoRS_Analysis(TCANtoRS *p) {
|
||||
int16 i,j;
|
||||
//посылка данных начинается с 12го байта,
|
||||
//до этого служебная информация API пакета
|
||||
p->MSG.id=0;
|
||||
p->MSG.id=(p->ReadPackData[0] & 7)<<8; //нижние 3 бита сдвигаем наверх;
|
||||
p->MSG.id|=p->ReadPackData[1];
|
||||
p->MSG.dlc=(p->ReadPackData[0]>>4) & 0xF; //верхние 4 бита сдвигаем вниз; длина посылки
|
||||
for (i=2,j=0;i<CANTORS_READ_DATA_MAX_LEN;i++,j++)
|
||||
p->MSG.data[j]=p->ReadPackData[i];
|
||||
p->callback_go=1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! Побайтовый обработчик приходящих по SCI данных.
|
||||
Работает по принципу дискретного автомата и пытается
|
||||
найти в посылке API пакет. Сначала ждет заданную сигнатуру,
|
||||
потом длину и т.п. В конце проверяет контрольную сумму и
|
||||
вызывает дальнейшие обработчики */
|
||||
//! \memberof TCANtoRS
|
||||
|
||||
void CANtoRS_Receive(TCANtoRS *p) {
|
||||
Uint16 MyReadCRC_u16;
|
||||
Uint16 MyCalcCRC;
|
||||
Uint32 temp_byte;
|
||||
Uint16 repeat;
|
||||
for (repeat=0;repeat<7; repeat++) {//обработка не более n байт за один вход в функцию
|
||||
|
||||
switch (p->APIpacketMode) {
|
||||
|
||||
case 0: { //ожидание сигнатуры
|
||||
|
||||
|
||||
if (p->UART->FR_bit.RXFE)
|
||||
return;
|
||||
temp_byte = p->UART->DR_bit.DATA;
|
||||
if (temp_byte!=0x7e) {
|
||||
p->MessDrop3++;
|
||||
return;
|
||||
}
|
||||
p->ReadPackDataCounter=0;//счетчик данных
|
||||
p->APIpacketMode=1; //сигрнатура найдена, режим приема данных
|
||||
break;
|
||||
};
|
||||
case 1: { //ожидание данных(полезная нагрузка) пакета
|
||||
//все последующие байты складываем в API буфер
|
||||
|
||||
if (p->UART->FR_bit.RXFE)
|
||||
return;
|
||||
temp_byte = p->UART->DR_bit.DATA;
|
||||
p->ReadPackData[p->ReadPackDataCounter++]=temp_byte;
|
||||
if (p->ReadPackDataCounter>=CANTORS_READ_DATA_MAX_LEN) {
|
||||
p->ReadPackDataCounter=0;//счетчик данных
|
||||
p->ReadCRCCounter=0;//счетчик контрольной суммы
|
||||
p->APIpacketMode=2; //данные приняты, режим приема и проверси CRC
|
||||
}
|
||||
break;
|
||||
};
|
||||
|
||||
case 2: { //ожидание CRC
|
||||
//все последующие байты складываем в CRC буфер
|
||||
|
||||
if (p->UART->FR_bit.RXFE)
|
||||
return;
|
||||
temp_byte = p->UART->DR_bit.DATA;
|
||||
p->ReadCRC[p->ReadCRCCounter++]=temp_byte;
|
||||
if (p->ReadCRCCounter>=2) {
|
||||
p->ReadCRCCounter=0;//счетчик контрольной суммы
|
||||
MyReadCRC_u16=(p->ReadCRC[0]&0xFF)+((p->ReadCRC[1]<<8)&0xFF00);//запаковываем двухбайтовую CRC в одну переменную
|
||||
MyCalcCRC=CANtoRS_C_CRC(p,p->ReadPackData,CANTORS_READ_DATA_MAX_LEN);
|
||||
if (MyCalcCRC!=MyReadCRC_u16) {
|
||||
//ошибка!
|
||||
p->CounterWrongCRC++;
|
||||
p->APIpacketMode=0;
|
||||
break;
|
||||
}//контрольная сумма принята и верна
|
||||
|
||||
CANtoRS_Analysis(p);
|
||||
if (p->callback_go) { //если выставлен флаг, вызов callback
|
||||
p->callback_go=0;
|
||||
p->APIpacketMode=3; //обработка callback
|
||||
}
|
||||
else
|
||||
p->APIpacketMode=0;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
};
|
||||
case 3: { //обработка callback
|
||||
p->CounterRes++;
|
||||
p->callback(&co1_vars, &(p->MSG));
|
||||
p->APIpacketMode=0;
|
||||
break;
|
||||
};
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*! Должна вызываться каждую секунду и отсылает
|
||||
CAN пакеты HeartBeat. Если отослать не выходит (передача занята),
|
||||
то сокращает последующий таймаут и, немного обождав, пытается
|
||||
отправить заново */
|
||||
//! \memberof TCANtoRS
|
||||
void CANtoRS_HeartBeat(TCANtoRS *p) {
|
||||
TZCanMsg MSG;
|
||||
int16 i;
|
||||
MSG.id=0xE<<7;//heartbeat
|
||||
MSG.id|=*p->nodeID;//номер узла
|
||||
MSG.dlc=1;//длина
|
||||
for (i=0;i<8;MSG.data[i++]=0);//очистка
|
||||
MSG.data[0]=5;//данные heartbeat
|
||||
if (!CANtoRS_Write(&MSG,p)) { //если не получилось отправить
|
||||
p->HeartCounter=(CANTORS_HEART_COUNTER_MAX-3); //вскоре пробуем сделать это еще раз
|
||||
p->HeartBeatGo=1;//и если будет событие на отправку SDO, но будет знать, что надо пропустить
|
||||
} else {
|
||||
p->HeartBeatGo=0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//! \memberof TCANtoRS
|
||||
Uint16 CANtoRS_WriteHelper(TZCanMsg* MSG,TCANtoRS *p) {
|
||||
if (p->HeartBeatGo) { //хочет отправиться HeartBeat
|
||||
CANtoRS_HeartBeat(p);
|
||||
p->MessDrop1++;
|
||||
return 0;//сообщение теряем...
|
||||
}
|
||||
if (CANtoRS_Write(MSG,p))
|
||||
p->CounterSended++;
|
||||
else {
|
||||
p->MessDrop2++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*! Из структуры CAN пакета формирует массив-посылку,
|
||||
где вначале 4 бита - длина, потом 1 бит пропуск и 11 идентификатор.
|
||||
Далее непосредственно данные. После конструирования посылка отправляется*/
|
||||
//! \memberof TCANtoRS
|
||||
Uint16 CANtoRS_Write(TZCanMsg* MSG,TCANtoRS *p) {
|
||||
if (!p->PacketInWait) { //нет пакета в буфере
|
||||
//копируем во временный буфер
|
||||
p->bufMSG=*MSG;
|
||||
p->PacketInWait=1;//флаг, что в буфере что-то есть
|
||||
return 1;
|
||||
//считается, что буфера на 1 позицию должно хватать
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
||||
//! \memberof TCANtoRS
|
||||
Uint16 CANtoRS_Write_Real(TZCanMsg* MSG,TCANtoRS *p) {
|
||||
int16 i;
|
||||
|
||||
p->TempData[0]=(MSG->dlc & 0xF)<<4;
|
||||
p->TempData[0]|=(MSG->id >> 8) & 7;
|
||||
p->TempData[1]=MSG->id & 0xFF;
|
||||
for (i=0;i<8;i++) p->TempData[i+2]=MSG->data[i];
|
||||
CANtoRS_SendP(p->TempData,10,p);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*! Вызывается из миллисекундного таймера, отсчитывает 1 секунду
|
||||
и вызывает функцию отправки HeartBeat. Заодно проверяет,
|
||||
если в SCI возникла какая-то ошибка и он остановился, перезапускает.
|
||||
*/
|
||||
|
||||
//! \memberof TCANtoRS
|
||||
void CANtoRS_calc(TCANtoRS *p) {
|
||||
|
||||
//если в буфере есть пакет, ожидающий отправки и передатчик свободен и не ждет heartbeat
|
||||
if (p->PacketInWait) {
|
||||
if (!CANtoRS_Write_Real(&p->bufMSG,p))//отправить не удалось?
|
||||
p->MessDrop2++;
|
||||
p->PacketInWait=0;//очищаем буфер
|
||||
}
|
||||
else{//если пакета на отправк нет, обрабатывается всё остальное. Можно бы и обрабатывать сразу, но не хватает ресурсов
|
||||
CANtoRS_Receive(p);
|
||||
p->HeartCounter++; //счетчик для HeartBeat
|
||||
|
||||
//не пора ли отправить HeartBeat?
|
||||
if (p->HeartCounter>=(CANTORS_HEART_COUNTER_MAX-1)) {
|
||||
p->HeartCounter=0;
|
||||
CANtoRS_HeartBeat(p);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*@}*/
|
89
Vsrc/V_CurPar.c
Normal file
89
Vsrc/V_CurPar.c
Normal file
@ -0,0 +1,89 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_CurPar.c
|
||||
\brief Расчет наблюдаемых текущих параметров (см. TCurPar)
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup V_CurPar */
|
||||
/*@{*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#include "DSP.h" // Device Headerfile and Examples Include File
|
||||
#include "V_IQmath.h" // библиотека IQmath
|
||||
#include "V_CurPar.h" // заголовочный файл
|
||||
#include "main.h"
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
//! Инициализация модуля
|
||||
|
||||
//! Так, всяие обнуления...
|
||||
//! \memberof TCurPar
|
||||
void CurPar_init(TCurPar* p) {
|
||||
//фильтры
|
||||
p->fPower.T = _IQ(0.001); //фильтр мощности для вывода на экран
|
||||
|
||||
}
|
||||
|
||||
//!Расчет мощности из данных фаз
|
||||
|
||||
//!Расчет происходит в двухфазной системе координат, привязанной к статору
|
||||
//!Для расчета используются мгнованнеые напряжения фаз UalphaRef, UbetaRef,
|
||||
//!мгнованные токи фаз Ialpha, Ibeta. Для каждой из осей напряжение умножается на ток,
|
||||
//!полученная мгновенная мощность суммируется с аналогичной мощностью по другой оси,
|
||||
//!а затем полученная суммартная мгновенная мощность фильтруется инерционным звеном первого порядка.
|
||||
//! \memberof TCurPar
|
||||
void CurPar_PowerCalcUf(TCurPar* p) {
|
||||
p->Ualpha = pwm.UalphaRef; //Напряжение заданное оси альфа
|
||||
p->Ubeta = pwm.UbetaRef; //Напряжение заданное оси бета
|
||||
|
||||
//мгновенная мощность по осям альфа и бета подается на вход фильтра
|
||||
p->fPower.input = _IQmpy(p->PowerK,
|
||||
_IQmpy(p->Ualpha,p->Ialpha)+_IQmpy(p->Ubeta,p->Ibeta));
|
||||
|
||||
//расчет фильтра
|
||||
p->fPower.calc(&p->fPower);
|
||||
//результат работы фильтра - текущая активная мощность.
|
||||
p->power = p->fPower.output;
|
||||
}
|
||||
|
||||
//!Расчет текущих параметров привода
|
||||
|
||||
//! \memberof TCurPar
|
||||
void CurPar_calc(TCurPar* p) {
|
||||
|
||||
CurPar_PowerCalcUf(p); //Расчет мощности
|
||||
}
|
||||
|
||||
//! \memberof TCurPar
|
||||
//Расчет внутреннего масштабирующего коэффицента мощности
|
||||
//для приведения различных типов расчетов мощности к базовой мощности drv_params.power
|
||||
void CurPar_slow_calc(TCurPar* p) {
|
||||
float PowerMaxReal;
|
||||
float PowerMaxScale;
|
||||
PowerMaxReal = (float) drv_params.I_nom * drv_params.U_nom;
|
||||
PowerMaxScale = _IQ6toF(drv_params.power);
|
||||
p->PowerK = _IQmpy(_IQ(PowerMaxReal / PowerMaxScale), _IQ(3.0/2));//дробь 3/2 нужна для преобразования мощности от 2х фазного представления к 3х фазному
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
605
Vsrc/V_DPR_eCAP.c
Normal file
605
Vsrc/V_DPR_eCAP.c
Normal file
@ -0,0 +1,605 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_DPR_eCAP.c
|
||||
\brief Ìîäóëü äàò÷èêà àáñîëþòíîãî ïîëîæåíèÿ ðîòîðà ñ èñïîëüçîâàíèåì ìîäóëåé CAP TDPReCAP (ñì. TDPReCAP)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.1 03/01/2013
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup V_DPR_eCAP */
|
||||
/*@{*/
|
||||
|
||||
#include "DSP.h" // Device Headerfile and Examples Include File
|
||||
#include "V_IQmath.h" // áèáëèîòåêà IQmath
|
||||
#include "V_DPR_eCAP.h" // çàãîëîâî÷íûé ôàéë ìîäóëÿ
|
||||
#include "main.h"
|
||||
|
||||
extern TDrvParams drv_params;
|
||||
//! Èíèöèàëèçàöèÿ
|
||||
|
||||
//!Ìîäóëè CAP_3, CAP_4, CAP_5 èíèöèàëèçèðóþòñÿ
|
||||
//!äëÿ çàõâàòà âðåìåíè ìåæäó ñîáûòèÿìè íàðàñòàþùåãî è ñïàäàþùåãî
|
||||
//!ôðîíòîâ, à òàêæå ãåíåðàöèè ïðåðûâàíèé ïî ýòèì ñîáûòèÿì.
|
||||
|
||||
//! \memberof TDPReCAP
|
||||
void DPReCAP_Init(TDPReCAP* p) {
|
||||
|
||||
//Èíèöèàëèçàöèÿ ECAP1
|
||||
ECAP0->ECEINT = 0x0000; // Disable all capture interrupts
|
||||
ECAP0->ECCLR = 0xFFFF; // Clear all CAP interrupt flags
|
||||
ECAP0->ECCTL0_bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads
|
||||
ECAP0->ECCTL1_bit.TSCTRSTOP = 0; // Make sure the counter is stopped
|
||||
ECAP0->ECCTL0_bit.PRESCALE = 0; // DIV1
|
||||
|
||||
// Configure peripheral registers
|
||||
ECAP0->ECCTL1_bit.CONTOST = 0; // continuous mode
|
||||
ECAP0->ECCTL0_bit.CAP0POL = 0; // rising edge
|
||||
ECAP0->ECCTL0_bit.CAP1POL = 1; // falling edge
|
||||
ECAP0->ECCTL0_bit.CTRRST0 = 0; // absolute time stamp
|
||||
ECAP0->ECCTL0_bit.CTRRST1 = 0; // absolute time stamp
|
||||
ECAP0->ECCTL1_bit.STOPWRAP = 1; // Wrap after Capture Event 2
|
||||
// ECAP0->ECCTL1_bit.SYNCI_EN = 1; // Enable sync in
|
||||
ECAP0->ECCTL1_bit.SYNCOSEL = 0; // Pass through
|
||||
ECAP0->ECCTL0_bit.CAPLDEN = 1; // Enable capture units
|
||||
|
||||
|
||||
|
||||
ECAP0->ECCTL1_bit.TSCTRSTOP = 1; // Start Counter
|
||||
ECAP0->ECCTL1_bit.REARM = 0; // Has no effect (Íå î÷åíü ïîíèìàþ ýòîò ðåãèñòð)
|
||||
ECAP0->ECCTL0_bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
|
||||
ECAP0->ECEINT_bit.CEVT0 = 1; // 1 events = interrupt
|
||||
ECAP0->ECEINT_bit.CEVT1 = 1; // 2 events = interrupt
|
||||
|
||||
//Èíèöèàëèçàöèÿ ECAP2
|
||||
ECAP1->ECEINT = 0x0000; // Disable all capture interrupts
|
||||
ECAP1->ECCLR = 0xFFFF; // Clear all CAP interrupt flags
|
||||
ECAP1->ECCTL0_bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads
|
||||
ECAP1->ECCTL1_bit.TSCTRSTOP = 0; // Make sure the counter is stopped
|
||||
ECAP1->ECCTL0_bit.PRESCALE = 0; // DIV1
|
||||
|
||||
// Configure peripheral registers
|
||||
ECAP1->ECCTL1_bit.CONTOST = 0; // continuous mode
|
||||
ECAP1->ECCTL0_bit.CAP0POL = 0; // rising edge
|
||||
ECAP1->ECCTL0_bit.CAP1POL = 1; // falling edge
|
||||
ECAP1->ECCTL0_bit.CTRRST0 = 0; // absolute time stamp
|
||||
ECAP1->ECCTL0_bit.CTRRST1 = 0; // absolute time stamp
|
||||
ECAP1->ECCTL1_bit.STOPWRAP = 1; // Wrap after Capture Event 2
|
||||
// ECAP1->ECCTL1_bit.SYNCI_EN = 1; // Enable sync in
|
||||
ECAP1->ECCTL1_bit.SYNCOSEL = 0; // Pass through
|
||||
ECAP1->ECCTL0_bit.CAPLDEN = 1; // Enable capture units
|
||||
|
||||
ECAP1->ECCTL1_bit.TSCTRSTOP = 1; // Start Counter
|
||||
ECAP1->ECCTL1_bit.REARM = 0; // Has no effect (Íå î÷åíü ïîíèìàþ ýòîò ðåãèñòð)
|
||||
ECAP1->ECCTL0_bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
|
||||
ECAP1->ECEINT_bit.CEVT0 = 1; // 1 events = interrupt
|
||||
ECAP1->ECEINT_bit.CEVT1 = 1; // 2 events = interrupt
|
||||
|
||||
//Èíèöèàëèçàöèÿ ECap3
|
||||
ECAP2->ECEINT = 0x0000; // Disable all capture interrupts
|
||||
ECAP2->ECCLR = 0xFFFF; // Clear all CAP interrupt flags
|
||||
ECAP2->ECCTL0_bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads
|
||||
ECAP2->ECCTL1_bit.TSCTRSTOP = 0; // Make sure the counter is stopped
|
||||
ECAP2->ECCTL0_bit.PRESCALE = 0; // DIV1
|
||||
|
||||
// Configure peripheral registers
|
||||
ECAP2->ECCTL1_bit.CONTOST = 0; // continuous mode
|
||||
ECAP2->ECCTL0_bit.CAP0POL = 0; // rising edge
|
||||
ECAP2->ECCTL0_bit.CAP1POL = 1; // falling edge
|
||||
ECAP2->ECCTL0_bit.CTRRST0 = 0; // absolute time stamp
|
||||
ECAP2->ECCTL0_bit.CTRRST1 = 0; // absolute time stamp
|
||||
ECAP2->ECCTL1_bit.STOPWRAP = 1; // Wrap after Capture Event 2
|
||||
// ECAP2->ECCTL1_bit.SYNCI_EN = 1; // Enable sync in
|
||||
ECAP2->ECCTL1_bit.SYNCOSEL = 0; // Pass through
|
||||
ECAP2->ECCTL0_bit.CAPLDEN = 1; // Enable capture units
|
||||
|
||||
ECAP2->ECCTL1_bit.TSCTRSTOP = 1; // Start Counter
|
||||
ECAP2->ECCTL1_bit.REARM = 0; // Has no effect (Íå î÷åíü ïîíèìàþ ýòîò ðåãèñòð)
|
||||
ECAP2->ECCTL0_bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
|
||||
ECAP2->ECEINT_bit.CEVT0 = 1; // 1 events = interrupt
|
||||
ECAP2->ECEINT_bit.CEVT1 = 1; // 2 events = interrupt
|
||||
|
||||
p->TsNom = ((SystemCoreClock / (drv_params.speed_nom * drv_params.p)) * 15*2);
|
||||
//êîýôôèöèåíò äëÿ ïåðåñ÷åòà âðåìåíè ìåæäó ìåòêàìè â ìñ â ñêîðîñòü â îá/ìèí
|
||||
//60 - îá/ìèí, 1000 ìñ â ñåêóíäå, 6 ìåòîê íà ýë. îáîðîò
|
||||
p->TsNomMilsec = (60.0*1000 / (6*drv_params.speed_nom * drv_params.p));
|
||||
|
||||
|
||||
DPReCAP_Angle6Calc(p);
|
||||
p->CAP_WrongEdgeCnt = 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//! Îïðåäåëåíèå óãëîâîãî ïîëîæåíèÿ ñ äèñêðåòíîñòüþ 60 ãðàäóñîâ
|
||||
|
||||
//!Îïðåäåëåíèå óãëîâîãî ïîëîæåíèÿ ïðîèñõîäèò èñõîäÿ èç îïðîñà òðåõ êàíàëîâ äàò÷èêà
|
||||
//!÷åðåç GPIO. Ðåçóëüòàò ïîïàäàåò â ïåðåìåííóþ Angle6.
|
||||
|
||||
//! \memberof TDPReCAP
|
||||
void DPReCAP_Angle6Calc(TDPReCAP* p) {
|
||||
// Íà ìîìåíò ðàñ÷¸òà, çàïðåùàåì ïðåðûâàíèÿ ïî äàò÷èêàì.
|
||||
//Åñëè ýòîãî íå ñäåëàòü, òî ýòà ôóíêöèÿ ìîæåò âûçâàòüñÿ â 10ê,
|
||||
//íà ïîëîâíå ïðåðâàòüñÿ ïðåðûâàíèåì CAP, â êîòîðîì îíà âûçîâåòñÿ âòîðîé ðàç,
|
||||
//ïîòîì óïðàâëåíèå âåðíåòñÿ ê ýòîé ôóíêöèè â 10ê è â p->Angle6 ïîïàäåò ñòàðûé ðåçóëüòàò
|
||||
ECAP0->ECEINT = 0x0000;
|
||||
ECAP1->ECEINT = 0x0000;
|
||||
ECAP2->ECEINT = 0x0000;
|
||||
|
||||
// Ôîðìèðóåì êîä ïî ñîñòîÿíèþ íîæåê.
|
||||
p->HallCode = 0;
|
||||
|
||||
#if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR)
|
||||
p->HallCode = model.hallSensor;
|
||||
|
||||
#else
|
||||
if (p->UserDirection == 0) {
|
||||
if (GPIOA->DATA & (1 << 4))
|
||||
p->HallCode = p->HallCode + 1;
|
||||
if (GPIOA->DATA & (1 << 5))
|
||||
p->HallCode = p->HallCode + 2;
|
||||
if (GPIOA->DATA & (1 << 6))
|
||||
p->HallCode = p->HallCode + 4;
|
||||
} else {
|
||||
if (GPIOA->DATA & (1 << 4))
|
||||
p->HallCode = p->HallCode + 4;
|
||||
if (GPIOA->DATA & (1 << 5))
|
||||
p->HallCode = p->HallCode + 2;
|
||||
if (GPIOA->DATA & (1 << 6))
|
||||
p->HallCode = p->HallCode + 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
switch (p->HallCode) {
|
||||
case 5: // 0
|
||||
p->Angle6 = 0;
|
||||
break;
|
||||
case 4: // 60
|
||||
p->Angle6 = _IQ(1.0 / 6.0);
|
||||
break;
|
||||
case 6: // 120
|
||||
p->Angle6 = _IQ(1.0 / 3.0);
|
||||
break;
|
||||
case 2: //180
|
||||
p->Angle6 = _IQ(1.0 / 2.0);
|
||||
break;
|
||||
case 3: // 240
|
||||
p->Angle6 = _IQ(2.0 / 3.0);
|
||||
break;
|
||||
case 1: // 300
|
||||
p->Angle6 = _IQ(5.0 / 6.0);
|
||||
break;
|
||||
}
|
||||
|
||||
// Ðàçðåøàåì ïðåðûâàíèÿ íàçàä.
|
||||
ECAP0->ECEINT = 6;
|
||||
ECAP1->ECEINT = 6;
|
||||
ECAP2->ECEINT = 6;
|
||||
}
|
||||
|
||||
void DPReCAP_AngleErrorCalc(TDPReCAP* p) {
|
||||
long AngleDiff = 0;
|
||||
AngleDiff = (labs(
|
||||
((p->Angle6 - p->AnglePrev + _IQ(0.5)) & 0x00FFFFFF) - _IQ(0.5)))
|
||||
& 0x00FFFFFF;
|
||||
p->AnglePrev = p->Angle6;
|
||||
|
||||
if (AngleDiff > _IQ(61.0 / 360)) { //åñëè óãîë ñ ïðîøëîãî ðàçà èçìåíèëñÿ áîëüøå, ÷åì íà 60 ãðàäóñîâ, òî äàò÷èê êîñÿ÷èò
|
||||
p->WrongCodeCounter++;
|
||||
p->WrongCodeCounterPerSec++;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//! Îïðåäåëåíèå óãëîâîãî ïîëîæåíèÿ ñ ó÷åòîì ðàáîòû èíòåðïîëÿòîðà óãëîâîãî ïîëîæåíèÿ
|
||||
|
||||
//!Èíòåðïîëÿòîð óãëîâîãî ïîëîæåíèÿ (à âåðíåå äàæå ýêñòðàïîëÿòîð)
|
||||
//!èñïîëüçóåò äèñêðåòíîå óãëîâîå ïîëîæåíèå Angle6, âûäàâàåìîå ôóíêöèåé DPReCAP_Angle6Calc.
|
||||
//!Ôóíêöèÿ "ñãëàæèâàåò" óãëîâîå ïîëîæåíèå âî âðåìåíè, äåëàÿ èç ñòåïåí÷àòîé ñìåíû óãëà "ëåñåíêîé"
|
||||
//!íåïðåðûâíóþ "ïèëó" (ïåðåìåííàÿ Angle). Äëÿ ýòîãî èñïîëüçóåòñÿ ñîõðàíåííîå âðåìÿ ìåæäó äâóìÿ ëþáûìè
|
||||
//!ïðåäûäóùèìè ôðîíòàìè ñ êàíàëîâ äàò÷èêà ïîëîæåíèÿ (PrevTs). Ñ÷èòàÿ, ÷òî ñêîðîñòü âðàùåíèÿ ïîñòîÿííà,
|
||||
//!ñëåäóþùèé ôðîíò (à çíà÷èò ñìåíó óãëîâîãî ïîëîæåíèÿ) ìîæíî ïðîãíîçèðîâàòü ÷åðåç òî æå ñàìîå âðåìÿ.
|
||||
//!Òàêèì îáðàçîì, ó òåêóùåìó äèñêðåòíîìó óãëîâîìó ïîëîæåíèþ Angle6 ïðèáàâëÿåòñÿ
|
||||
//!äîáàâêà, ðàññ÷èòûâàåìàÿ ïî ôîðìóëå 60*(Òåêóùåå âðåìÿ/Ïåðèîä).
|
||||
//!Òàê, â ìîìåíò ïðèõîäà ôðîíòà ñ äàò÷èêà ïåðåìåííàÿ Angle ðàâíà Angle6. ×åðåç íåêîòîðûé ìîìåíò âðåìåíè
|
||||
//! Angle ñòàíåò ðàâíûì Angle6+60*(delta/Ts), ãäå delta - òåêóùåå âðåìÿ ñ ìîìåíòà ñîáûòèÿ ïîñëåäíåãî ôðîíòà ñ äàò÷èêà,
|
||||
//! à Ts - ïåðèîä, âðåìÿ ìåæäó ïðåäûäóùèìè äâóìÿ ñîáûòèÿìè ôðîíðîâ äàò÷èêà.
|
||||
//! Ôóíêöèÿ òàêæå ó÷èòûâàåò íàïðàâëåíèå âðàùåíèÿ, à òàêæå äîáàâëÿåò ïîëüçîâàòåëüñêîå ñìåùåíèå
|
||||
//! AngleOffset ê ðåçóëüòèðóþùåìó óãëîâîìó ïîëîæåíèþ.
|
||||
|
||||
//! \memberof TDPReCAP
|
||||
void DPReCAP_AngleCalc(TDPReCAP* p) {
|
||||
Uint32 delta, Timer;
|
||||
Uint32 PrevTs;
|
||||
_iq Angle;
|
||||
_iq Angle6;
|
||||
|
||||
// Ôèêñèðóåì çíà÷åíèÿ ïåðåìåííûõ íà ìîìåíò íà÷àëà ðàñ÷¸òà
|
||||
Angle6 = p->Angle6;
|
||||
|
||||
#if (!defined(HW_VECTORCARD_SIMULATOR)) && (!defined(HW_NIIET_BOARD_SIMULATOR))
|
||||
|
||||
PrevTs = p->PrevTs;
|
||||
// Íà ìîìåíò ðàñ÷¸òà, çàïðåùàåì ïðåðûâàíèÿ ïî äàò÷èêàì.
|
||||
ECAP0->ECEINT = 0x0000;
|
||||
ECAP1->ECEINT = 0x0000;
|
||||
ECAP2->ECEINT = 0x0000;
|
||||
|
||||
|
||||
|
||||
// Ôèêñèðóåì çíà÷åíèå îäíîãî èç òàéìåðîâ íà ìîìåíò íà÷àëà âûïîëíåíèÿ ìîäóëÿ.
|
||||
switch (p->DPReCAP_FLG1.bit.CAPnumber) {
|
||||
case 1:
|
||||
Timer = ECAP0->TSCTR;
|
||||
break;
|
||||
case 2:
|
||||
Timer = ECAP1->TSCTR;
|
||||
break;
|
||||
case 3:
|
||||
Timer = ECAP2->TSCTR;
|
||||
break;
|
||||
}
|
||||
|
||||
// Åñëè ñêîðîñòü ðàâíà íóëþ èëè âûáðàí ñîîòâåòñòâóþùèé ðåæèì, òî óãîë íå èíòåïîëèðóåì.
|
||||
if ((p->speed == 0) || (p->DPReCAP_FLG1.bit.AngleMode == 0)
|
||||
|| (p->Ts == 0)) {
|
||||
Angle = _IQ(1.0 / 12);
|
||||
} else {
|
||||
delta = Timer - PrevTs; // Ñêîëüêî íàòèêàë òàéìåð ñ ìîìåíòà ïðîøëîãî îáíîâëåíèÿ ïåðèîäà.
|
||||
Angle = _IQdiv(delta, p->Ts); // Èíòåïîëèðóåì óãîë. Îòíîøåíèå ïðîøëîãî ïåðåõîäà ê òåêóùèì "òèêàì".
|
||||
if (Angle >= _IQ(1.0 / 6.0)) // îãðàíè÷èâàåì óãîë â ïðèäåëàõ 1/6.
|
||||
Angle = _IQ(1.0 / 6.0);
|
||||
}
|
||||
#else //ñèìóëÿòîð
|
||||
Angle=_IQ(model.hallSensorInterpAdd * (1/(2*MOTOR_MODEL_PI)));//ïðèðàùåíèå óãëà äëÿ èíòåðïîëÿòîðà óæå ïðåäïîñ÷èòàíî â ìîäåëè äâèãàòåëÿ ñ ó÷åòîì äèñêðåòíîñòè
|
||||
#endif
|
||||
|
||||
if (p->DPReCAP_FLG1.bit.Dir == 1)
|
||||
Angle = _IQ(1.0/6.0) - Angle;
|
||||
|
||||
if (p->UserDirection) //ïîëüçîâàòåëüñêàÿ èíâåðñèÿ íàïðàâëåíèÿ
|
||||
Angle = -Angle + _IQ(1.0/6);
|
||||
|
||||
p->Angle = Angle6 + Angle + p->AngleOffset;
|
||||
|
||||
p->Angle &= 0x00FFFFFF;
|
||||
|
||||
|
||||
// Ðàçðåøàåì ïðåðûâàíèÿ íàçàä.
|
||||
ECAP0->ECEINT = 6;
|
||||
ECAP1->ECEINT = 6;
|
||||
ECAP2->ECEINT = 6;
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ ðàñ÷åòà ñêîðîñòè
|
||||
|
||||
//!Äëÿ ðàñ÷åòà ñêîðîñòè èñïîëüçóåòñÿ ïåðåìåííàÿ Tspeed,
|
||||
//!êîòîðàÿ ïðåäñòàâëÿåò ñîáîé âðåìÿ ìåæäó ñîáûòèÿìè ôðîíòîâ äàò÷èêà ïîëîæåíèÿ
|
||||
//!ïðîèçîøåäøèõ ïî îäíîìó è òîìó æå êàíàëó. Òàê, íàïðèìåð, âðåìåíåì ìåæäó íàðàñòàþùèì è ñïàäàþùèì ôðîíòîì
|
||||
//!êàíàëà CAP3, çàòåì ìåæäó ñïàäàþùèì è íàðàñòàþùèì ôðîíòîì CAP4 è ò.ï.
|
||||
//!Íà îñíîâå ýòîãî âðåìåíè, íàïðàâëåíèÿ âðàùåíèÿ è ïðåäïîñ÷èòàííîé êîíñòàíòîé TsNom
|
||||
//!ðàññ÷èòûâàåòñÿ ñêîðîñòü âðàùåíèÿ.
|
||||
|
||||
//! \memberof TDPReCAP
|
||||
void DPReCAP_SpeedCalc(TDPReCAP* p) {
|
||||
#if (!defined(HW_VECTORCARD_SIMULATOR)) && (!defined(HW_NIIET_BOARD_SIMULATOR))
|
||||
|
||||
_iq speed;
|
||||
|
||||
// Ñ÷èòàåì ñêîðîñòü â îòíîñèòåëüíûõ åäèíèöàõ îòíîñèòåëüíî íîìèíàëüíîé.
|
||||
if ((p->Tspeed != 0) && (p->DPReCAP_FLG1.bit.ZeroFLG == 0)) {
|
||||
|
||||
// Çíàê ñêîðîñòè îïðäåëÿåòñÿ â çàâèñèìîñòè îò íàïðàâëåíèÿ.
|
||||
if (p->DPReCAP_FLG1.bit.Dir == 0)
|
||||
speed = _IQdiv(p->TsNom, p->Tspeed);
|
||||
else
|
||||
speed = -_IQdiv(p->TsNom, p->Tspeed);
|
||||
if (p->UserDirection) { //çàäàåòñÿ ïîëüçîâàòåëåì
|
||||
speed = -speed;
|
||||
}
|
||||
} else {
|
||||
speed = 0;
|
||||
}
|
||||
|
||||
p->speed = speed;
|
||||
|
||||
|
||||
DINT;//íóæíî äëÿ ïîòîêîáåçîïàñíîãî îáðàùåíèÿ ê ïåðåìåííîé DPReCAP_FLG1 (÷òîáû íå ïåðåòåðåòü ïðèñâàèâàíèå â ïðåðûâàíèè çàõâàòà)
|
||||
// Îáíóëåíèå ñêîðîñòè, åñëè ïðèâûñèëè çàäàííîå âðåìÿ ìåæäó äâóìÿ ñîñåäíèìè ñîáûòèÿìè.
|
||||
if (p->milsec > p->milsecFIX) {
|
||||
p->speed = 0;
|
||||
p->DPReCAP_FLG1.bit.ZeroFLG = 1;
|
||||
// p->cnt1 = 0; // Íàäî îáíóëÿòü ïðè ñòîïå è hold'å. Çäåñü íå íàäî, òîëüêî äëÿ òåñòà.
|
||||
}
|
||||
EINT;
|
||||
|
||||
DINT;//íóæíî äëÿ ïîòîêîáåçîïàñíîãî îáðàùåíèÿ ê ïåðåìåííîé DPReCAP_FLG1 (÷òîáû íå ïåðåòåðåòü ïðèñâàèâàíèå â ïðåðûâàíèè çàõâàòà)
|
||||
|
||||
// Ïðè ñêîðîñòè ìåíüøå çàäàííîé, îòêëþ÷àåì èíòåðïîëÿöèþ óãëà.
|
||||
if ((labs(p->speed)) <= (p->speedMIN))
|
||||
p->DPReCAP_FLG1.bit.SpeedMinFLG = 0;
|
||||
else
|
||||
p->DPReCAP_FLG1.bit.SpeedMinFLG = 1;
|
||||
EINT;
|
||||
|
||||
#else //ñèìóëÿòîð
|
||||
p->speed=p->SimulatorOmega2IQ_factor*model.hallSensorOmega;//×àñòîòà âðàùåíèÿ óæå ïðåäïîñ÷èòàíà â ìîäåëè äâèãàòåëÿ ñ ó÷åòîì äèñêðåòíîñòè
|
||||
#endif
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ, âûçûâàåìàÿ â ïðåðûâàíèè ïî íàðàñòàþùåìó è ñïàäàþùåìó ôðîíòó êàíàëà äàò÷èêà 1
|
||||
|
||||
//! Â ôóíêöèè çàïîìèíàåòñÿ âðåìÿ òàéìåðà ìîäóëÿ CAP â ïåðåìåííóþ Timer1.
|
||||
//! Èñõîäÿ èç ýòîãî ñ÷èòàþòñÿ äâå ïåðåìåííûå - p->Ts, âðåìÿ ìåæäó äâóìÿ áëèæàéøèìè ôðîíòàìè,
|
||||
//!íåîáõîäèìîå äëÿ èíòåðïîëÿòîðà óãëîâîãî ïîëîæåíèÿ, è ïåðåìåííàÿ p->Tspeed,
|
||||
//!âðåìÿ ìåæäó äâóìÿ ôðîíòàìè îäíîãî è òîãî æå êàíàëà, íåîáîäèìîå äëÿ ðàñ÷åòà ñêîðîñòè.
|
||||
//! \memberof TDPReCAP
|
||||
void DPReCAP_CAP1Calc(TDPReCAP* p) {
|
||||
Uint32 Timer=0;
|
||||
if (p->cnt >= 2) {
|
||||
p->cnt=2;
|
||||
p->HelpCalc(p);
|
||||
|
||||
// Â çàâèñèìîñòè îò íîìåðà ïðåäóäûùåãî CAP îïðåäåëÿåì íàïðàâëåíèå âðàùåíèÿ.
|
||||
if (p->DPReCAP_FLG1.bit.CAPnumber == 3)
|
||||
p->DPReCAP_FLG1.bit.Dir = 0;
|
||||
if (p->DPReCAP_FLG1.bit.CAPnumber == 2)
|
||||
p->DPReCAP_FLG1.bit.Dir = 1;
|
||||
if (p->DPReCAP_FLG1.bit.CAPnumber == 1) {
|
||||
if (p->DPReCAP_FLG1.bit.PrevDir == 0)
|
||||
p->DPReCAP_FLG1.bit.Dir = 1;
|
||||
else
|
||||
p->DPReCAP_FLG1.bit.Dir = 0;
|
||||
}
|
||||
if (p->DPReCAP_FLG1.bit.Dir != p->DPReCAP_FLG1.bit.PrevDir) {
|
||||
p->DPReCAP_FLG1.bit.PrevDir = p->DPReCAP_FLG1.bit.Dir;
|
||||
p->cnt2 = 1;
|
||||
}
|
||||
|
||||
if (ECAP0->ECFLG_bit.CEVT0==1)//Ôðîíò ââåðõ
|
||||
{
|
||||
Timer = ECAP0->CAP0;
|
||||
}
|
||||
if (ECAP0->ECFLG_bit.CEVT1==1)//Ôðîíò âíèç
|
||||
{
|
||||
Timer = ECAP0->CAP1;
|
||||
}
|
||||
|
||||
// ñ÷èòàåì ïåðèîäû äëÿ ðàñ÷¸òà óãëà è ñêîðîñòè.
|
||||
p->Ts = (Timer - p->PrevTs) * 6;
|
||||
p->PrevTs = Timer;
|
||||
|
||||
p->Tspeed = Timer - p->PrevTspeed1;
|
||||
p->PrevTspeed1 = Timer;
|
||||
|
||||
} else {
|
||||
p->Ts = 0;
|
||||
p->Tspeed = 0;
|
||||
}
|
||||
|
||||
|
||||
p->cnt++;
|
||||
p->milsec = 0;
|
||||
p->DPReCAP_FLG1.bit.CAPnumber = 1;
|
||||
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ, âûçûâàåìàÿ â ïðåðûâàíèè ïî íàðàñòàþùåìó è ñïàäàþùåìó ôðîíòó êàíàëà äàò÷èêà 2
|
||||
|
||||
//! Â ôóíêöèè çàïîìèíàåòñÿ âðåìÿ òàéìåðà ìîäóëÿ CAP â ïåðåìåííóþ Timer1.
|
||||
//! Èñõîäÿ èç ýòîãî ñ÷èòàþòñÿ äâå ïåðåìåííûå - p->Ts, âðåìÿ ìåæäó äâóìÿ áëèæàéøèìè ôðîíòàìè,
|
||||
//!íåîáõîäèìîå äëÿ èíòåðïîëÿòîðà óãëîâîãî ïîëîæåíèÿ, è ïåðåìåííàÿ p->Tspeed,
|
||||
//!âðåìÿ ìåæäó äâóìÿ ôðîíòàìè îäíîãî è òîãî æå êàíàëà, íåîáîäèìîå äëÿ ðàñ÷åòà ñêîðîñòè.
|
||||
//! \memberof TDPReCAP
|
||||
void DPReCAP_CAP2Calc(TDPReCAP* p) {
|
||||
Uint32 Timer=0;
|
||||
if (p->cnt >= 2) {
|
||||
p->cnt=2;
|
||||
p->HelpCalc(p);
|
||||
|
||||
// Â çàâèñèìîñòè îò íîìåðà ïðåäóäûùåãî CAP îïðåäåëÿåì íàïðàâëåíèå âðàùåíèÿ.
|
||||
if (p->DPReCAP_FLG1.bit.CAPnumber == 1)
|
||||
p->DPReCAP_FLG1.bit.Dir = 0;
|
||||
if (p->DPReCAP_FLG1.bit.CAPnumber == 3)
|
||||
p->DPReCAP_FLG1.bit.Dir = 1;
|
||||
if (p->DPReCAP_FLG1.bit.CAPnumber == 2) {
|
||||
if (p->DPReCAP_FLG1.bit.PrevDir == 0)
|
||||
p->DPReCAP_FLG1.bit.Dir = 1;
|
||||
else
|
||||
p->DPReCAP_FLG1.bit.Dir = 0;
|
||||
}
|
||||
|
||||
if (p->DPReCAP_FLG1.bit.Dir != p->DPReCAP_FLG1.bit.PrevDir) {
|
||||
p->DPReCAP_FLG1.bit.PrevDir = p->DPReCAP_FLG1.bit.Dir;
|
||||
p->cnt2 = 1;
|
||||
}
|
||||
|
||||
if (ECAP1->ECFLG_bit.CEVT0==1)
|
||||
{
|
||||
Timer = ECAP1->CAP0;
|
||||
}
|
||||
if (ECAP1->ECFLG_bit.CEVT1==1)
|
||||
{
|
||||
Timer = ECAP1->CAP1;
|
||||
}
|
||||
|
||||
// ñ÷èòàåì ïåðèîäû äëÿ ðàñ÷¸òà óãëà è ñêîðîñòè.
|
||||
p->Ts = (Timer - p->PrevTs) * 6;
|
||||
p->PrevTs = Timer;
|
||||
|
||||
p->Tspeed = Timer - p->PrevTspeed2;
|
||||
p->PrevTspeed2 = Timer;
|
||||
|
||||
} else {
|
||||
p->Ts = 0;
|
||||
p->Tspeed = 0;
|
||||
}
|
||||
|
||||
|
||||
p->cnt++;
|
||||
p->milsec = 0;
|
||||
p->DPReCAP_FLG1.bit.CAPnumber = 2;
|
||||
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ, âûçûâàåìàÿ â ïðåðûâàíèè ïî íàðàñòàþùåìó è ñïàäàþùåìó ôðîíòó êàíàëà äàò÷èêà 3
|
||||
|
||||
//! Â ôóíêöèè çàïîìèíàåòñÿ âðåìÿ òàéìåðà ìîäóëÿ CAP â ïåðåìåííóþ Timer1.
|
||||
//! Èñõîäÿ èç ýòîãî ñ÷èòàþòñÿ äâå ïåðåìåííûå - p->Ts, âðåìÿ ìåæäó äâóìÿ áëèæàéøèìè ôðîíòàìè,
|
||||
//!íåîáõîäèìîå äëÿ èíòåðïîëÿòîðà óãëîâîãî ïîëîæåíèÿ, è ïåðåìåííàÿ p->Tspeed,
|
||||
//!âðåìÿ ìåæäó äâóìÿ ôðîíòàìè îäíîãî è òîãî æå êàíàëà, íåîáîäèìîå äëÿ ðàñ÷åòà ñêîðîñòè.
|
||||
//! \memberof TDPReCAP
|
||||
void DPReCAP_CAP3Calc(TDPReCAP* p) {
|
||||
Uint32 Timer;
|
||||
if (p->cnt >= 2) {
|
||||
p->cnt=2;
|
||||
p->HelpCalc(p);
|
||||
|
||||
// Â çàâèñèìîñòè îò íîìåðà ïðåäóäûùåãî CAP îïðåäåëÿåì íàïðàâëåíèå âðàùåíèÿ.
|
||||
if (p->DPReCAP_FLG1.bit.CAPnumber == 2)
|
||||
p->DPReCAP_FLG1.bit.Dir = 0;
|
||||
if (p->DPReCAP_FLG1.bit.CAPnumber == 1)
|
||||
p->DPReCAP_FLG1.bit.Dir = 1;
|
||||
if (p->DPReCAP_FLG1.bit.CAPnumber == 3) {
|
||||
if (p->DPReCAP_FLG1.bit.PrevDir == 0)
|
||||
p->DPReCAP_FLG1.bit.Dir = 1;
|
||||
else
|
||||
p->DPReCAP_FLG1.bit.Dir = 0;
|
||||
}
|
||||
|
||||
if (p->DPReCAP_FLG1.bit.Dir != p->DPReCAP_FLG1.bit.PrevDir) {
|
||||
p->DPReCAP_FLG1.bit.PrevDir = p->DPReCAP_FLG1.bit.Dir;
|
||||
p->cnt2 = 1;
|
||||
}
|
||||
|
||||
if (ECAP2->ECFLG_bit.CEVT0==1)
|
||||
{
|
||||
Timer = ECAP2->CAP0;
|
||||
}
|
||||
if (ECAP2->ECFLG_bit.CEVT1==1)
|
||||
{
|
||||
Timer = ECAP2->CAP1;
|
||||
}
|
||||
|
||||
|
||||
// ñ÷èòàåì ïåðèîäû äëÿ ðàñ÷¸òà óãëà è ñêîðîñòè.
|
||||
p->Ts = (Timer - p->PrevTs) * 6;
|
||||
p->PrevTs = Timer;
|
||||
|
||||
p->Tspeed = Timer - p->PrevTspeed3;
|
||||
p->PrevTspeed3 = Timer;
|
||||
|
||||
} else {
|
||||
p->Ts = 0;
|
||||
p->Tspeed = 0;
|
||||
}
|
||||
|
||||
|
||||
p->cnt++;
|
||||
p->milsec = 0;
|
||||
p->DPReCAP_FLG1.bit.CAPnumber = 3;
|
||||
}
|
||||
|
||||
void DPReCAP_calc_10k(TDPReCAP* p) {
|
||||
|
||||
DINT;
|
||||
if (p->CAPCalcEna1==0){
|
||||
p->CAPCalcEna1=1;
|
||||
ECAP0->ECCLR_bit.CEVT0 = 1;
|
||||
ECAP0->ECCLR_bit.CEVT1 = 1;
|
||||
ECAP0->ECCLR_bit.INT = 1;
|
||||
}
|
||||
if (p->CAPCalcEna2==0){
|
||||
p->CAPCalcEna2=1;
|
||||
ECAP1->ECCLR_bit.CEVT0 = 1;
|
||||
ECAP1->ECCLR_bit.CEVT1 = 1;
|
||||
ECAP1->ECCLR_bit.INT = 1;
|
||||
}
|
||||
if (p->CAPCalcEna3==0){
|
||||
p->CAPCalcEna3=1;
|
||||
ECAP2->ECCLR_bit.CEVT0 = 1;
|
||||
ECAP2->ECCLR_bit.CEVT1 = 1;
|
||||
ECAP2->ECCLR_bit.INT = 1;
|
||||
}
|
||||
EINT;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void DPReCAP_HelpCalc(TDPReCAP* p) {
|
||||
// Îáíóëÿåì ñêîðîñòü è âûñòàâëÿåì ôëàã,
|
||||
// åñëè âðåìÿ ìåæäó äâóìÿ ñîáûòèÿìè áîëüøå çàäàííîãî.
|
||||
if (p->milsec > p->milsecFIX) {
|
||||
p->speed = 0;
|
||||
p->DPReCAP_FLG1.bit.ZeroFLG = 1;
|
||||
} else {
|
||||
p->DPReCAP_FLG1.bit.ZeroFLG = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void DPReCAP_SlowCalc(TDPReCAP* p) {
|
||||
//ôîðìóëà äëÿ ðàñ÷åòà T=Ts/Tfiltra ãäå - Tfiltra ïîñòîÿííàÿ âðåìåíè ôèëüòðà
|
||||
// p->AngleFilter_1_T=_IQdiv(FAST_CALC_TS,AngleFilterT);
|
||||
if (p->enabled)
|
||||
if (p->initialized==0){
|
||||
p->Init(p);
|
||||
GPIOA->ALTFUNCSET = (1 << 4) + (1 << 5) + (1 << 6);
|
||||
GPIOA->DENSET = (1 << 4) + (1 << 5) + (1 << 6);
|
||||
SIU->REMAPAF_bit.ECAP0EN = 1;
|
||||
SIU->REMAPAF_bit.ECAP1EN = 1;
|
||||
SIU->REMAPAF_bit.ECAP2EN = 1;
|
||||
p->initialized=1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DPReCAP_msCalc(TDPReCAP* p) {
|
||||
p->milsec++;//ñ÷åò÷èê âðåìåíè îòñóòñòâèÿ ìåòîê
|
||||
if (p->milsecREF != p->milsecPrevREF) {
|
||||
p->milsecFIX=p->milsecREF;
|
||||
p->speedMinREF = _IQdiv(p->TsNomMilsec, p->milsecFIX);
|
||||
p->milsecPrevREF = p->milsecREF;
|
||||
}
|
||||
|
||||
p->ErrorLevelTimeCounterBig++;
|
||||
if (p->ErrorLevelTimeCounterBig > 10000) {
|
||||
p->ErrorLevel = p->ErrorLevelCounter;
|
||||
p->ErrorLevelCounter = 0;
|
||||
p->ErrorLevelTimeCounterBig = 0;
|
||||
}
|
||||
|
||||
p->ErrorLevelTimeCounter++;
|
||||
if (p->ErrorLevelTimeCounter > 1000) {
|
||||
if (p->WrongCodeCounterPerSec > p->WrongCodeCounterLimitPerSec){
|
||||
p->SensorFault = 1;
|
||||
} else
|
||||
p->SensorFault = 0;
|
||||
p->WrongCodeCounterPerSec=0;
|
||||
p->ErrorLevelTimeCounter = 0;
|
||||
}
|
||||
|
||||
|
||||
if (p->CAP_WrongEdgeCntPrev != p->CAP_WrongEdgeCnt)
|
||||
p->ErrorLevelCounter++;
|
||||
p->CAP_WrongEdgeCntPrev = p->CAP_WrongEdgeCnt;
|
||||
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
217
Vsrc/V_Global_time.c
Normal file
217
Vsrc/V_Global_time.c
Normal file
@ -0,0 +1,217 @@
|
||||
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file Global_time.c
|
||||
\brief Ìîäóëü ðàáîòû ñî âðåìåíåì
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.2 2013_10_16
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup Global_time */
|
||||
/*@{*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include <main.h>
|
||||
|
||||
|
||||
//!Èíèöèàëèçàöèß ìîäóëß
|
||||
|
||||
//!Åñëè åñòü ÷àñû ðåàëüíîãî âðåìåíè, ñ÷èòûâàåò èç íèõ âðåìß.
|
||||
//!Âîññòàíàâëèâàåò âðåìß ðàáîòû è âðåìåíè âêëþ÷åííîãî ñîñòîßíèß èç SPI.
|
||||
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_init(TGlobalTime *p)
|
||||
{
|
||||
p->read_PowerOn_time(p);
|
||||
p->read_oper_time(p);
|
||||
|
||||
|
||||
#ifdef USE_ABSOLUTE_TIME_CLOCK
|
||||
//èíèöèàëèçàöèß àáñîëþòíîãî âðåìåíè
|
||||
if (p->time_type == 1)
|
||||
{
|
||||
//èíèöèàëèçàöèß èç ÷àñîâ ðåàëüíîãî âðåìåíè
|
||||
p->absolute_time.day=spiclock.day;
|
||||
p->absolute_time.hour=spiclock.hour;
|
||||
p->absolute_time.minute=spiclock.minute;
|
||||
p->absolute_time.second=spiclock.second;
|
||||
p->absolute_time.year=spiclock.year;
|
||||
}
|
||||
#endif
|
||||
//èíèöèàëèçàöèß îòíîñèòåëüíîãî âðåìåíè
|
||||
p->relative_time1.ON = 1;//ò.ê. 1-å âðåìß ßâëßåòñß îáßçàòåëüíûì
|
||||
|
||||
p->relative_time1.relative_date.hour = (p->PowerOn_time >> 6);
|
||||
p->relative_time1.relative_date.minute = (p->PowerOn_time & 0x3f);
|
||||
|
||||
p->relative_time2.relative_date.hour = (p->operational_time >> 6);
|
||||
p->relative_time2.relative_date.minute = (p->operational_time & 0x3f);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//!Ðàñ÷åò îòíîñèòåëüíîãî âðåìåíè.
|
||||
|
||||
//!Âûçûâàåò ôóíêöèè ðàñ÷åòà îòíîñèòåëüíî âðåìåíè è, åñëè åñòü, ñ÷èòûâàåò âðåìß
|
||||
//!ñ ìîäóëß ÷àñîâ ðåàëüíîãî âåðìåíè â àáñîëþòíîå âðåìß.
|
||||
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_calc(TGlobalTime *p)
|
||||
{
|
||||
//ñ÷åò îòíîñèòåëüíûõ âðåìåí
|
||||
GlobalTime_REL_TIME_calc(&p->relative_time1);
|
||||
GlobalTime_REL_TIME_calc(&p->relative_time2);
|
||||
}
|
||||
|
||||
|
||||
//!Ðàñ÷åò îòíîñèòåëüíîãî âðåìåíè.
|
||||
|
||||
//!Âûçûâàåò ôóíêöèè ðàñ÷åòà îòíîñèòåëüíî âðåìåíè è, åñëè åñòü, ñ÷èòûâàåò âðåìß
|
||||
//!ñ ìîäóëß ÷àñîâ ðåàëüíîãî âåðìåíè â àáñîëþòíîå âðåìß.
|
||||
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_ms_calc(TGlobalTime *p) {
|
||||
|
||||
//óïðàâëåíèå ñ÷åòîì operational_time
|
||||
if (sm_ctrl.state != 0) //Åñëè â êàêîì-òî ðåæèìå ðàáîòû
|
||||
global_time.relative_time2.ON = TRUE;
|
||||
else
|
||||
global_time.relative_time2.ON = FALSE;
|
||||
|
||||
//Âðåìß çàïèòàííîãî ñîñòîßíèß â ìèíóòàõ
|
||||
p->PowerOn_time = (global_time.relative_time1.relative_date.hour << 6) + (global_time.relative_time1.relative_date.minute & 0x3f);
|
||||
//Âðåìß â ðàáîòå, â ìèíóòàõ
|
||||
p->operational_time = (global_time.relative_time2.relative_date.hour << 6) + (global_time.relative_time2.relative_date.minute & 0x3f);
|
||||
|
||||
p->PowerOn_time_min = p->relative_time1.relative_date.hour*60 +p->relative_time1.relative_date.minute;
|
||||
p->operational_time_min = p->relative_time2.relative_date.hour*60 + p->relative_time2.relative_date.minute;
|
||||
|
||||
|
||||
#ifdef USE_ABSOLUTE_TIME_CLOCK
|
||||
if (global_time.time_type == 1) {
|
||||
//âðåìß - èç ÷àñîâ ðåàëüíîãî âðåìåíè
|
||||
global_time.absolute_time.day = spiclock.day;
|
||||
global_time.absolute_time.hour = spiclock.hour;
|
||||
global_time.absolute_time.minute = spiclock.minute;
|
||||
global_time.absolute_time.second = spiclock.second;
|
||||
global_time.absolute_time.year = spiclock.year;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//!Ðàñ÷åò îòíîñèòåëüíîãî âðåìåíè
|
||||
|
||||
//!Ó÷èòûâàß, ÷òî ôóíêöèß âûçûâàåòñß ñ êàêîé-òî îïðåäåëåííîé äèñêðåòèçàöèåé,
|
||||
//!èíêðåìåíòèðóåò îòíîñèòåëüíîå âðåìß, ïåðåäåííîå åé â ñòðóêòóðå òèïà RELATIVE_TIME
|
||||
//! \memberof TGlobalTime
|
||||
void GlobalTime_REL_TIME_calc(RELATIVE_TIME *p) {
|
||||
if (p->ON == 0)
|
||||
return;
|
||||
if (p->tic_isr != 0)
|
||||
p->tic_isr--;
|
||||
p->delta_millisecond = 0;
|
||||
p->delta_second = 0;
|
||||
if (p->tic_isr == 0) {
|
||||
//ìèëëèñåêóíäà
|
||||
p->tic_isr = GLOBAL_TIME_CALC_FREQ;
|
||||
p->millisecond_counter++;
|
||||
p->delta_millisecond = 1;
|
||||
if (p->relative_date.millisecond == 999) {
|
||||
//ñåêóíäà
|
||||
p->relative_date.millisecond = 0;
|
||||
p->second_counter++;
|
||||
p->delta_second = 1;
|
||||
if (p->relative_date.second == 59) {
|
||||
//ìèíóòà
|
||||
p->relative_date.second = 0;
|
||||
if (p->relative_date.minute == 59) {
|
||||
//÷àñ
|
||||
p->relative_date.minute = 0;
|
||||
p->relative_date.hour++;
|
||||
} else
|
||||
p->relative_date.minute++;
|
||||
} else
|
||||
p->relative_date.second++;
|
||||
} else
|
||||
p->relative_date.millisecond++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//!×èòàåò âðåìß íàðàáîòêè.
|
||||
|
||||
//! \memberof TCurPar
|
||||
void GlobalTime_read_PowerOn_time(TGlobalTime *p) { //÷òåíèå work_time
|
||||
UserMem.MemStartAddr = GLOBAL_TIME_POWER_ON_TIME_ADDR;
|
||||
UserMem.MCUStartAddr = (Uint16*) (&(p->PowerOn_time));
|
||||
UserMem.data_length = 4;
|
||||
UserMem.read(&UserMem);
|
||||
}
|
||||
|
||||
|
||||
//!çàïèñûâàåò âðåìß íàðàáîòêè.
|
||||
|
||||
//! \memberof TCurPar
|
||||
void GlobalTime_write_PowerOn_time(TGlobalTime *p) { //çàïèñü work_time
|
||||
UserMem.MemStartAddr = GLOBAL_TIME_POWER_ON_TIME_ADDR;
|
||||
UserMem.MCUStartAddr = (Uint16*) (&(p->PowerOn_time));
|
||||
UserMem.data_length = 4;
|
||||
UserMem.write(&UserMem);
|
||||
}
|
||||
|
||||
//!×èòàåò âðåìß âêëþ÷åííîãî ñîñîòßíèß.
|
||||
//! \memberof TCurPar
|
||||
void GlobalTime_read_oper_time(TGlobalTime *p) { //÷òåíèå operational_time
|
||||
UserMem.MemStartAddr = GLOBAL_TIME_OPERATIONAL_TIME_ADDR;
|
||||
UserMem.MCUStartAddr = (Uint16*) (&(p->operational_time));
|
||||
UserMem.data_length = 4;
|
||||
UserMem.read(&UserMem);
|
||||
}
|
||||
|
||||
//!çàïèñûâàåò âðåìß âêëþ÷åííîãî ñîñîòßíèß.
|
||||
//! \memberof TCurPar
|
||||
void GlobalTime_write_oper_time(TGlobalTime *p) { //çàïèñü operational_time
|
||||
UserMem.MemStartAddr = GLOBAL_TIME_OPERATIONAL_TIME_ADDR;
|
||||
UserMem.MCUStartAddr = (Uint16*) (&(p->operational_time));
|
||||
UserMem.data_length = 4;
|
||||
UserMem.write(&UserMem);
|
||||
}
|
||||
|
||||
|
||||
void GlobalTime_slow_calc(TGlobalTime*p) {
|
||||
//åñëè ñòîèò ôëàã íà ñîõðàíåíèå âðåìåí â SPI èëè ñ ìîìåíò ïðîøëîé çàïèñè ïðîøåë ÷àñ
|
||||
if ((p->WtiteSPI_flag) || (p->PrevWriteSPIHour != global_time.relative_time1.relative_date.hour)) {
|
||||
|
||||
p->write_PowerOn_time(p); //çàïèñü âðåìåíè âêë. ñîñòîßíèß
|
||||
p->write_oper_time(p); //çàïèñü ðàáî÷åãî âðåìåíè
|
||||
p->PrevWriteSPIHour = global_time.relative_time1.relative_date.hour;
|
||||
p->WtiteSPI_flag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // Extern "C"
|
||||
#endif
|
||||
/*@}*/
|
||||
|
280
Vsrc/V_IQmath.c
Normal file
280
Vsrc/V_IQmath.c
Normal file
@ -0,0 +1,280 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_IQmath.c
|
||||
\brief Áèáëèîòåêà ôóíêöèé öåëî÷èñëåííîé ìàòåìàòèêè
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup V_IQmath
|
||||
@{*/
|
||||
|
||||
#include "V_IQmath.h"
|
||||
#include "stdlib.h"
|
||||
#include "math.h"
|
||||
|
||||
#if defined (__GNUC__) || defined (CMCPPARM)
|
||||
#if defined (__GNUC__)
|
||||
// Count leading zeros, using processor-specific instruction if available.
|
||||
#define clz(x) __builtin_clzl(x)
|
||||
#endif
|
||||
#if defined (CMCPPARM) //CodeMaster
|
||||
#define clz(x) __CLZ(x)
|
||||
#endif
|
||||
#else
|
||||
static uint8_t clz(uint32_t x) {
|
||||
uint8_t result = 0;
|
||||
if (x == 0) return 32;
|
||||
while (!(x & 0xF0000000)) {
|
||||
result += 4;
|
||||
x <<= 4;
|
||||
}
|
||||
while (!(x & 0x80000000)) {
|
||||
result += 1;
|
||||
x <<= 1;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
//! Äåëåíèå äâóõ ÷èñåë â ôîðìàòå 22.10
|
||||
|
||||
//! \memberof V_IQmath
|
||||
int32 _IQ10div(int32 a, int32 b) {
|
||||
if (b == 0)
|
||||
return 0;
|
||||
return _IQ10((float )(a) / b); //32 òàêòà
|
||||
}
|
||||
|
||||
//! Äåëåíèå äâóõ ÷èñåë â ôîðìàòå 8.24
|
||||
//! \memberof V_IQmath
|
||||
int32 _IQ24div(int32 a, int32 b) {
|
||||
if (b == 0)
|
||||
return 0;
|
||||
return _IQ24((float )a / b); //32 òàêòà
|
||||
}
|
||||
|
||||
|
||||
//! Êâàäðàòíûé êîðåíü â ôîðìàòå 8.24. Ðàáîòàåò ÷åðåç àïïàðàòíûé float, çàíèìàåò 43 òàêòà.
|
||||
//! Â CodeMaster íåò ôóíêöèè sqrtf, ïîýòîìó äëÿ íåãî âûçûâàåòñÿ sqrt. Äëÿ GCC âûçûâàòü
|
||||
//! sqrt íåëüçÿ, ò.ê. òîãäà îí ïîïûòàåòñÿ ðàáîòàòü ñ double, à íå float.
|
||||
int32 _IQ24sqrt(int32 number) {
|
||||
return _IQ(sqrtf((float)_IQtoF(number)));
|
||||
}
|
||||
|
||||
|
||||
|
||||
static const int16 sinTableQ15[259] = {
|
||||
0xfcdc, 0x0, 0x324, 0x648, 0x96b, 0xc8c, 0xfab, 0x12c8,
|
||||
0x15e2, 0x18f9, 0x1c0c, 0x1f1a, 0x2224, 0x2528, 0x2827, 0x2b1f,
|
||||
0x2e11, 0x30fc, 0x33df, 0x36ba, 0x398d, 0x3c57, 0x3f17, 0x41ce,
|
||||
0x447b, 0x471d, 0x49b4, 0x4c40, 0x4ec0, 0x5134, 0x539b, 0x55f6,
|
||||
0x5843, 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e9, 0x66d0,
|
||||
0x68a7, 0x6a6e, 0x6c24, 0x6dca, 0x6f5f, 0x70e3, 0x7255, 0x73b6,
|
||||
0x7505, 0x7642, 0x776c, 0x7885, 0x798a, 0x7a7d, 0x7b5d, 0x7c2a,
|
||||
0x7ce4, 0x7d8a, 0x7e1e, 0x7e9d, 0x7f0a, 0x7f62, 0x7fa7, 0x7fd9,
|
||||
0x7ff6, 0x7fff, 0x7ff6, 0x7fd9, 0x7fa7, 0x7f62, 0x7f0a, 0x7e9d,
|
||||
0x7e1e, 0x7d8a, 0x7ce4, 0x7c2a, 0x7b5d, 0x7a7d, 0x798a, 0x7885,
|
||||
0x776c, 0x7642, 0x7505, 0x73b6, 0x7255, 0x70e3, 0x6f5f, 0x6dca,
|
||||
0x6c24, 0x6a6e, 0x68a7, 0x66d0, 0x64e9, 0x62f2, 0x60ec, 0x5ed7,
|
||||
0x5cb4, 0x5a82, 0x5843, 0x55f6, 0x539b, 0x5134, 0x4ec0, 0x4c40,
|
||||
0x49b4, 0x471d, 0x447b, 0x41ce, 0x3f17, 0x3c57, 0x398d, 0x36ba,
|
||||
0x33df, 0x30fc, 0x2e11, 0x2b1f, 0x2827, 0x2528, 0x2224, 0x1f1a,
|
||||
0x1c0c, 0x18f9, 0x15e2, 0x12c8, 0xfab, 0xc8c, 0x96b, 0x648,
|
||||
0x324, 0x0, 0xfcdc, 0xf9b8, 0xf695, 0xf374, 0xf055, 0xed38,
|
||||
0xea1e, 0xe707, 0xe3f4, 0xe0e6, 0xdddc, 0xdad8, 0xd7d9, 0xd4e1,
|
||||
0xd1ef, 0xcf04, 0xcc21, 0xc946, 0xc673, 0xc3a9, 0xc0e9, 0xbe32,
|
||||
0xbb85, 0xb8e3, 0xb64c, 0xb3c0, 0xb140, 0xaecc, 0xac65, 0xaa0a,
|
||||
0xa7bd, 0xa57e, 0xa34c, 0xa129, 0x9f14, 0x9d0e, 0x9b17, 0x9930,
|
||||
0x9759, 0x9592, 0x93dc, 0x9236, 0x90a1, 0x8f1d, 0x8dab, 0x8c4a,
|
||||
0x8afb, 0x89be, 0x8894, 0x877b, 0x8676, 0x8583, 0x84a3, 0x83d6,
|
||||
0x831c, 0x8276, 0x81e2, 0x8163, 0x80f6, 0x809e, 0x8059, 0x8027,
|
||||
0x800a, 0x8000, 0x800a, 0x8027, 0x8059, 0x809e, 0x80f6, 0x8163,
|
||||
0x81e2, 0x8276, 0x831c, 0x83d6, 0x84a3, 0x8583, 0x8676, 0x877b,
|
||||
0x8894, 0x89be, 0x8afb, 0x8c4a, 0x8dab, 0x8f1d, 0x90a1, 0x9236,
|
||||
0x93dc, 0x9592, 0x9759, 0x9930, 0x9b17, 0x9d0e, 0x9f14, 0xa129,
|
||||
0xa34c, 0xa57e, 0xa7bd, 0xaa0a, 0xac65, 0xaecc, 0xb140, 0xb3c0,
|
||||
0xb64c, 0xb8e3, 0xbb85, 0xbe32, 0xc0e9, 0xc3a9, 0xc673, 0xc946,
|
||||
0xcc21, 0xcf04, 0xd1ef, 0xd4e1, 0xd7d9, 0xdad8, 0xdddc, 0xe0e6,
|
||||
0xe3f4, 0xe707, 0xea1e, 0xed38, 0xf055, 0xf374, 0xf695, 0xf9b8,
|
||||
0xfcdc, 0x0, 0x324
|
||||
};
|
||||
|
||||
|
||||
|
||||
//! Ôóíêöèÿ ñèíóñà, òàáëè÷íàÿ, òî÷íàÿ, ñ êóáè÷åñêîé èíòåðïîëÿöèåé ìåæäó òî÷êàìè.
|
||||
|
||||
//! Âíóòðè ðàáîòàåò ñ òîíîñòüþ 16.16, íî êîíâåðòèðóåòñÿ â 8.24
|
||||
//! 83 òàêòà
|
||||
//!Âçÿòî èç áèáëèîòåêè DSP ARM
|
||||
//! \memberof V_IQmath
|
||||
int32 _IQ24sinPU_accurate(
|
||||
int32 x) {
|
||||
int32 sinVal; /* Temporary variables output */
|
||||
int16 *tablePtr; /* Pointer to table */
|
||||
int16 fract, in, in2; /* Temporary variables for input, output */
|
||||
int32 wa, wb, wc, wd; /* Cubic interpolation coefficients */
|
||||
int16 a, b, c, d; /* Four nearest output values */
|
||||
int16 fractCube, fractSquare; /* Temporary values for fractional value */
|
||||
int16 oneBy6 = 0x1555; /* Fixed point16 value of 1/6 */
|
||||
int16 tableSpacing = 0x80; /* Table spacing */
|
||||
int32 index; /* Index variable */
|
||||
|
||||
in = (x>>9)&0x7FFF;
|
||||
|
||||
|
||||
/* Calculate the nearest index */
|
||||
index = (int32_t) in / tableSpacing;
|
||||
|
||||
/* Calculate the nearest value of input */
|
||||
in2 = (int16) ((index) * tableSpacing);
|
||||
|
||||
/* Calculation of fractional value */
|
||||
fract = (in - in2) << 8;
|
||||
|
||||
/* fractSquare = fract * fract */
|
||||
fractSquare = (int16) ((fract * fract) >> 15);
|
||||
|
||||
/* fractCube = fract * fract * fract */
|
||||
fractCube = (int16) ((fractSquare * fract) >> 15);
|
||||
|
||||
/* Checking min and max index of table */
|
||||
if (index < 0) {
|
||||
index = 0;
|
||||
} else if (index > 256) {
|
||||
index = 256;
|
||||
}
|
||||
|
||||
/* Initialise table pointer */
|
||||
tablePtr = (int16 *) & sinTableQ15[index];
|
||||
|
||||
/* Cubic interpolation process */
|
||||
/* Calculation of wa */
|
||||
/* wa = -(oneBy6)*fractCube + (fractSquare >> 1u) - (0x2AAA)*fract; */
|
||||
wa = (int32) oneBy6 *fractCube;
|
||||
wa += (int32) 0x2AAA *fract;
|
||||
wa = -(wa >> 15);
|
||||
wa += ((int32) fractSquare >> 1u);
|
||||
|
||||
/* Read first nearest value of output from the sin table */
|
||||
a = *tablePtr++;
|
||||
|
||||
/* sinVal = a * wa */
|
||||
sinVal = a * wa;
|
||||
|
||||
/* Calculation of wb */
|
||||
wb = (((int32) fractCube >> 1u) - (int32) fractSquare) -
|
||||
(((int32) fract >> 1u) - 0x7FFF);
|
||||
|
||||
/* Read second nearest value of output from the sin table */
|
||||
b = *tablePtr++;
|
||||
|
||||
/* sinVal += b*wb */
|
||||
sinVal += b * wb;
|
||||
|
||||
|
||||
/* Calculation of wc */
|
||||
wc = -(int32) fractCube + fractSquare;
|
||||
wc = (wc >> 1u) + fract;
|
||||
|
||||
/* Read third nearest value of output from the sin table */
|
||||
c = *tablePtr++;
|
||||
|
||||
/* sinVal += c*wc */
|
||||
sinVal += c * wc;
|
||||
|
||||
/* Calculation of wd */
|
||||
/* wd = (oneBy6)*fractCube - (oneBy6)*fract; */
|
||||
fractCube = fractCube - fract;
|
||||
wd = ((int16) (((int32) oneBy6 * fractCube) >> 15));
|
||||
|
||||
/* Read fourth nearest value of output from the sin table */
|
||||
d = *tablePtr++;
|
||||
|
||||
/* sinVal += d*wd; */
|
||||
sinVal += d * wd;
|
||||
|
||||
|
||||
/* Return the output value */
|
||||
return sinVal>>6;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//! Ôóíêöèÿ ñèíóñà, ïðèáëèæåííàÿ, áûñòðàÿ.
|
||||
|
||||
//!A sine approximation via a fourth-order cosine approx.
|
||||
//! Âíóòðè ðàáîòàåò ñ òî÷íîñòüþ 16.16, íî êîíâåðòèðóåòñÿ â 8.24
|
||||
//! http://www.coranac.com/2009/07/sines/
|
||||
//! 30 òàêòîâ
|
||||
//! \memberof V_IQmath
|
||||
|
||||
int32 _IQ24sinPU(int32 x) {
|
||||
int32 c, y;
|
||||
static const int32 qN = 13, qA = 12, B = 19900, C = 3516;
|
||||
x = x >> 9; //from 8.24
|
||||
c = x << (30 - qN); // Semi-circle info into carry.
|
||||
x -= 1 << qN; // sine -> cosine calc
|
||||
|
||||
x = x << (31 - qN); // Mask with PI
|
||||
x = x >> (31 - qN); // Note: SIGNED shift! (to qN)
|
||||
x = x * x >> (2 * qN - 14); // x=x^2 To Q14
|
||||
|
||||
y = B - (x * C >> 14); // B - x^2*C
|
||||
y = (1 << qA) - (x * y >> 16); // A - x^2*(B-x^2*C)
|
||||
y = y << 12; // to 8.24
|
||||
return c >= 0 ? y : -y;
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ atan2.
|
||||
|
||||
//!http://www.dspguru.com/dsp/tricks/fixed-point-atan2-with-self-normalization
|
||||
//!100 òàêòîâ
|
||||
|
||||
//! \memberof V_IQmath
|
||||
int32 _IQ24atan2PU(int32 inY , int32 inX) {
|
||||
int32 abs_inY, angle, r, r_3;
|
||||
|
||||
abs_inY = labs(inY)+1;// kludge to prevent 0/0 condition
|
||||
|
||||
if (inX >= 0) {
|
||||
r = _IQ24div( (inX - abs_inY), (inX + abs_inY));
|
||||
r_3=_IQmpy(_IQmpy(r,r),r);
|
||||
angle = _IQ24mpy(_IQ(0.1963f/(2.0f*_PI)),r_3)-_IQ24mpy(_IQ(0.9817f/(2.0f*_PI)),r)+_IQ24(_PI/4.0f/(2.0f*_PI));
|
||||
} else {
|
||||
r = _IQ24div( (inX + abs_inY), (abs_inY - inX));
|
||||
r_3=_IQmpy(_IQmpy(r,r),r);
|
||||
angle = _IQ24mpy(_IQ(0.1963f/(2.0f*_PI)),r_3)-_IQ24mpy(_IQ(0.9817f/(2.0f*_PI)),r)+_IQ24(3.0f*_PI/4.0f/(2.0f*_PI));
|
||||
}
|
||||
if (inY < 0) {
|
||||
angle = -angle;
|
||||
}
|
||||
angle=angle&0xFFFFFF;
|
||||
return angle;
|
||||
}
|
||||
|
||||
|
||||
//! Ôóíêöèÿ âû÷èñëåíèÿ àìïëèòóäû âåêòîðà
|
||||
//! 60 òàêòîâ
|
||||
|
||||
//! \memberof V_IQmath
|
||||
int32 _IQ24mag(int32 a, int32 b) {
|
||||
return _IQ24sqrt(_IQ24mpy(a, a) + _IQ24mpy(b, b));
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
652
Vsrc/V_PWM_Module.c
Normal file
652
Vsrc/V_PWM_Module.c
Normal file
@ -0,0 +1,652 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_PWM_Module.c
|
||||
\brief Ìîäóëü ðåàëèçàöèè âåêòîðíîé ØÈÌ (ñì. TPWM_Module)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup V_PWM_Module
|
||||
@{*/
|
||||
|
||||
|
||||
#include "V_IQmath.h"
|
||||
#include "V_PWM_Module.h"
|
||||
#include "main.h"
|
||||
|
||||
//! Èíèöèàëèçàöèÿ
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_Init(TPWM_Module *p) {
|
||||
SIU->PWMSYNC_bit.PRESCRST = 0; //ñèíõðîíèçàöèÿ òàéìåðîâ - ñáðîñ âíóòðåííèõ ñ÷åò÷èêîâ
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Íàñòðàèâàåì ìîäóëü ePWM0
|
||||
// ------------------------------------------------------------------------
|
||||
if (p->Frequency < PWM_FREQ_MIN)
|
||||
p->Frequency = PWM_FREQ_MIN;
|
||||
if (p->Frequency > PWM_FREQ_MAX)
|
||||
p->Frequency = PWM_FREQ_MAX;
|
||||
PWM0->TBPRD = _IQ10div(_IQ10(SystemCoreClock/1000.0), p->Frequency << 1) >> 10; //ïåðèîä
|
||||
|
||||
p->k_pwm = PWM0->TBPRD;
|
||||
p->FreqPrev = p->Frequency; //ïðåäûäóùàÿ ÷àñòîòà
|
||||
PWM0->TBPHS_bit.TBPHS = 0x0000; // Phase is 0
|
||||
PWM0->TBCTR = 0x0000; // Clear counter
|
||||
|
||||
// Setup counter mode
|
||||
PWM0->TBCTL_bit.PRDLD = TB_SHADOW; // çàãðóçêà TBPRD ïðè TBCTR = 0
|
||||
PWM0->TBCTL_bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down
|
||||
PWM0->TBCTL_bit.PHSEN = TB_DISABLE; // Disable phase loading
|
||||
PWM0->TBCTL_bit.PHSDIR = TB_UP; // Ñ÷èòàòü ââåðõ ïîñëå çàãðóçêè ôàçû
|
||||
PWM0->TBCTL_bit.HSPCLKDIV = 0; // High Speed Time-base Clock Prescale
|
||||
PWM0->TBCTL_bit.CLKDIV = 0; // Time-base Clock Prescale
|
||||
PWM0->TBCTL_bit.SYNCOSEL = TB_CTR_ZERO; // âûäà¸ì ñèíõðî-ñèãíàë ïðè TBCTR = 0
|
||||
|
||||
// Setup shadowing
|
||||
PWM0->CMPCTL_bit.SHDWAMODE = CC_SHADOW; //âêëþ÷èòü SHADOW äëÿ ñðàâíåíèÿ
|
||||
PWM0->CMPCTL_bit.LOADAMODE = CC_CTR_ZERO; // Load on period and zero
|
||||
|
||||
PWM0->CMPCTL_bit.SHDWBMODE = CC_SHADOW; //âêëþ÷èòü SHADOW äëÿ ñðàâíåíèÿ
|
||||
PWM0->CMPCTL_bit.LOADBMODE = CC_CTR_ZERO; // Load on period and zero
|
||||
|
||||
// Set Compare values
|
||||
PWM0->CMPA_bit.CMPA = 0; // Set compare A value
|
||||
|
||||
// Set actions
|
||||
PWM0->AQCTLA = AQ_EPWM_DISABLE; // äëÿ íà÷àëà ñîáûòèÿ äëÿ PWM1A çàïðåùåíû
|
||||
PWM0->AQCTLA_bit.ZRO = 1; //îáíóëÿåì ïðè íóëå ñ÷åò÷èêà
|
||||
PWM0->AQCTLA_bit.CAU = 2; //âêëþ÷àåì ïðè ñðàâíåíèè è èíêðåìåíòèîâàíèè
|
||||
PWM0->AQCTLA_bit.CAD = 1; //îáíóëÿåì ïðè ñðàâíåíèè è äåêðåìåíòðîâàíèè
|
||||
|
||||
//Äëÿ PWMB òîæå ñàìîå, ÷òî äëÿ PWMÀ. Áåç èíâåðñèè. Èíâåðñèÿ äàëåå â ìîäóëå ÌÂ
|
||||
PWM0->AQCTLB = PWM0->AQCTLA; // äëÿ íà÷àëà ñîáûòèÿ äëÿ PWM1B çàïðåùåíû
|
||||
PWM0->AQCTLB_bit.ZRO = PWM0->AQCTLA_bit.ZRO; //îáíóëÿåì ïðè íóëå ñ÷åò÷èêà
|
||||
PWM0->AQCTLB_bit.CAU = PWM0->AQCTLA_bit.CAU; //âêëþ÷àåì ïðè ñðàâíåíèè è èíêðåìåíòèîâàíèè
|
||||
PWM0->AQCTLB_bit.CAD = PWM0->AQCTLA_bit.CAD; //îáíóëÿåì ïðè ñðàâíåíèè è äåêðåìåíòðîâàíèè
|
||||
|
||||
PWM0->AQSFRC_bit.RLDCSF = 0; //ïî ÒÎ íàäî ïèñàòü 0
|
||||
|
||||
// Setup Deadband
|
||||
// DBRED = DBFED = 150 * Tì_ìêñ / 4
|
||||
PWM0->DBRED = _IQ4mpy(_IQ4(150 / 4), p->DeadBand >> 20) >> 4;
|
||||
PWM0->DBFED = PWM0->DBRED;
|
||||
|
||||
// Íàñòðîéêà ìîäóëÿ ì¸ðòâîãî âðåìåíè:
|
||||
// INMODE: S5=0 S4=0 - ñèãíàë ñ çàäåðæàííûì ïåðåäíèì ôðîíòîì è ñèãíàë ñ çàäåðæàííûì çàäíèì ôðîíòîì
|
||||
// ôîðìèðóþòñÿ èç ñèãíàëà PWMA
|
||||
// POLSEL: S3 = 1 S2 = 1 - ñèãíàë ñ çàäåðæàííûì ïåðåäíèì ôðîíòîì èä¸ò êàê åñòü, à ñèãíàë
|
||||
// ñ çàäåðæàííûì çàäíèì ôðîíòîì èíâåðòèðóåòñÿ
|
||||
// OUTMODE:S0 = 1 S1 = 1 íà êàíàë PWMA âûõîäèò èñõîäíûé ñèãíàë PWMA, íî ñ çàäåðæàííûì ïåðåäíèì ôðîíòîì
|
||||
// Íà êàíàë PWMB âûõîäèò ñèãíàë PWMA ñ çàäåðæàííûì çàäíèì ôðîíòîì äà åù¸ è ñ èíâåðñèåé
|
||||
PWM0->DBCTL_bit.INMODE = DBA_ALL;
|
||||
PWM0->DBCTL_bit.POLSEL = DB_ACTV_HIC;
|
||||
PWM0->DBCTL_bit.OUTMODE = DB_FULL_ENABLE;
|
||||
|
||||
PWM0->ETSEL_bit.INTSEL = ET_DISABLE; // Disable INT (øèìîâñêîå)
|
||||
PWM0->ETSEL_bit.INTEN = 0; // Disable INT
|
||||
|
||||
|
||||
//ðàçðåøàåì TZ áûòü èñòî÷íèêîì àïïàðàòíîé àâàðèè (one-shot)
|
||||
// PWM0->TZSEL_bit.OSHT1 = TZ_ENABLE;
|
||||
// PWM0->TZSEL_bit.OSHT2 = TZ_ENABLE;
|
||||
// PWM0->TZSEL_bit.OSHT3 = TZ_ENABLE;
|
||||
|
||||
// Trip-Zone
|
||||
PWM0->TZCTL_bit.TZA = TZ_STATE; // ïî ñîáûòèþ "One-Shot Trip" ïåðåâîäèì
|
||||
PWM0->TZCTL_bit.TZB = TZ_STATE; // ØÈÌ âûõîäû â íóæíîå ñîñòîÿíèå
|
||||
|
||||
//Äëÿ VectorCARD îò ØÈÌà çàïóñêàåòñÿ ADC
|
||||
//PWM0->ETSEL_bit.SOCAEN = 1; // Ðàçðåøèòü çàïóñê àöï
|
||||
//PWM0->ETSEL_bit.SOCASEL = 1; // Çàïóñêàòü ïðè CTR == 0 (Underflow)
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Íàñòðàèâàåì ìîäóëü ePWM1
|
||||
// ------------------------------------------------------------------------
|
||||
// Setup TBCLK
|
||||
PWM1->TBPRD = PWM0->TBPRD; //ïåðèîä òàêîé æå
|
||||
PWM1->TBPHS_bit.TBPHS = 0x0001; // Ôàçà ðàâíà 1 èç-çà çàäåðæêè â îäèí òàêò íà ñèíõðîíèçàöèþ
|
||||
PWM1->TBCTR = 0x0000; // Clear counter
|
||||
|
||||
// Setup counter mode
|
||||
PWM1->TBCTL_bit.PRDLD = TB_SHADOW; // çàãðóçêà TBPRD ïðè TBCTR = 0
|
||||
PWM1->TBCTL_bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down
|
||||
PWM1->TBCTL_bit.PHSEN = TB_ENABLE; // Enable phase loading
|
||||
PWM1->TBCTL_bit.PHSDIR = TB_UP; // Ñ÷èòàòü ââåðõ ïîñëå çàãðóçêè ôàçû
|
||||
PWM1->TBCTL_bit.HSPCLKDIV = 0; // High Speed Time-base Clock Prescale
|
||||
PWM1->TBCTL_bit.CLKDIV = 0; // Time-base Clock Prescale
|
||||
PWM1->TBCTL_bit.SYNCOSEL = TB_SYNC_IN; // ïðîïóñêàåì ñèíõðî-ñèãíàë "íàñêâîçü"
|
||||
|
||||
// Setup shadowing
|
||||
PWM1->CMPCTL_bit.SHDWAMODE = CC_SHADOW; //âêëþ÷èòü SHADOW äëÿ ñðàâíåíèÿ
|
||||
PWM1->CMPCTL_bit.LOADAMODE = CC_CTR_ZERO; // Load on period and zero
|
||||
|
||||
PWM1->CMPCTL_bit.SHDWBMODE = CC_SHADOW; //âêëþ÷èòü SHADOW äëÿ ñðàâíåíèÿ
|
||||
PWM1->CMPCTL_bit.LOADBMODE = CC_CTR_ZERO; // Load on period and zero
|
||||
|
||||
// Set Compare values
|
||||
PWM1->CMPA_bit.CMPA = 0; // Set compare A value
|
||||
|
||||
// Set actions
|
||||
PWM1->AQCTLA = AQ_EPWM_DISABLE; // äëÿ íà÷àëà ñîáûòèÿ çàïðåùåíû
|
||||
PWM1->AQCTLA_bit.ZRO = 1; //îáíóëÿåì ïðè íóëå ñ÷åò÷èêà
|
||||
PWM1->AQCTLA_bit.CAU = 2; //âêëþ÷àåì ïðè ñðàâíåíèè è èíêðåìåíòèîâàíèè
|
||||
PWM1->AQCTLA_bit.CAD = 1; //îáíóëÿåì ïðè ñðàâíåíèè è äåêðåìåíòðîâàíèè
|
||||
|
||||
//Äëÿ PWMB òîæå ñàìîå, ÷òî äëÿ PWMÀ. Áåç èíâåðñèè. Èíâåðñèÿ äàëåå â ìîäóëå ÌÂ
|
||||
PWM1->AQCTLB = PWM0->AQCTLA; // äëÿ íà÷àëà ñîáûòèÿ äëÿ PWM1B çàïðåùåíû
|
||||
PWM1->AQCTLB_bit.ZRO = PWM0->AQCTLA_bit.ZRO; //îáíóëÿåì ïðè íóëå ñ÷åò÷èêà
|
||||
PWM1->AQCTLB_bit.CAU = PWM0->AQCTLA_bit.CAU; //âêëþ÷àåì ïðè ñðàâíåíèè è èíêðåìåíòèîâàíèè
|
||||
PWM1->AQCTLB_bit.CAD = PWM0->AQCTLA_bit.CAD; //îáíóëÿåì ïðè ñðàâíåíèè è äåêðåìåíòðîâàíèè
|
||||
|
||||
PWM1->AQSFRC_bit.RLDCSF = 0; //ïî ÒÎ íàäî ïèñàòü 0
|
||||
|
||||
// Active high complementary PWMs - Setup Deadband
|
||||
PWM1->DBRED = PWM0->DBRED;
|
||||
PWM1->DBFED = PWM1->DBRED;
|
||||
PWM1->DBCTL_bit.INMODE = PWM0->DBCTL_bit.INMODE;
|
||||
PWM1->DBCTL_bit.OUTMODE = PWM0->DBCTL_bit.OUTMODE;
|
||||
PWM1->DBCTL_bit.POLSEL = PWM0->DBCTL_bit.POLSEL;
|
||||
|
||||
// Interrupt where we will change the Compare Values
|
||||
PWM1->ETSEL_bit.INTSEL = ET_DISABLE; // Disable INT
|
||||
PWM1->ETSEL_bit.INTEN = 0; // Disable INT
|
||||
|
||||
// Trip-Zone
|
||||
PWM1->TZCTL_bit.TZA = TZ_STATE; // ïî ñîáûòèþ "One-Shot Trip" ïåðåâîäèì
|
||||
PWM1->TZCTL_bit.TZB = TZ_STATE; // ØÈÌ âûõîäû â íóæíîå ñîñòîÿíèå
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Íàñòðàèâàåì ìîäóëü ePWM2
|
||||
// ------------------------------------------------------------------------
|
||||
// Setup TBCLK
|
||||
PWM2->TBPRD = PWM0->TBPRD;
|
||||
PWM2->TBPHS_bit.TBPHS = 0x0001; // Ôàçà ðàâíà 1 èç-çà çàäåðæêè â îäèí òàêò íà ñèíõðîíèçàöèþ
|
||||
PWM2->TBCTR = 0x0000; // Clear counter
|
||||
|
||||
// Setup counter mode
|
||||
PWM2->TBCTL_bit.PRDLD = TB_SHADOW; // çàãðóçêà TBPRD ïðè TBCTR = 0
|
||||
PWM2->TBCTL_bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down
|
||||
PWM2->TBCTL_bit.PHSEN = TB_ENABLE; // Enable phase loading
|
||||
PWM2->TBCTL_bit.PHSDIR = TB_UP; // Ñ÷èòàòü ââåðõ ïîñëå çàãðóçêè ôàçû
|
||||
PWM2->TBCTL_bit.HSPCLKDIV = 0; // High Speed Time-base Clock Prescale
|
||||
PWM2->TBCTL_bit.CLKDIV = 0; // Time-base Clock Prescale
|
||||
PWM2->TBCTL_bit.SYNCOSEL = TB_SYNC_IN; // ðàçðåøàåì âûäà÷ó ñèíõðî-ñèãíàëà
|
||||
|
||||
// Setup shadowing
|
||||
PWM2->CMPCTL_bit.SHDWAMODE = CC_SHADOW; //âêëþ÷èòü SHADOW äëÿ ñðàâíåíèÿ
|
||||
PWM2->CMPCTL_bit.LOADAMODE = CC_CTR_ZERO; // Load on period and zero
|
||||
|
||||
PWM2->CMPCTL_bit.SHDWBMODE = CC_SHADOW; //âêëþ÷èòü SHADOW äëÿ ñðàâíåíèÿ
|
||||
PWM2->CMPCTL_bit.LOADBMODE = CC_CTR_ZERO; // Load on period and zero
|
||||
|
||||
// Set Compare values
|
||||
PWM2->CMPA_bit.CMPA = 0; // Set compare A value
|
||||
|
||||
// Set actions
|
||||
PWM2->AQCTLA = AQ_EPWM_DISABLE; // äëÿ íà÷àëà ñîáûòèÿ çàïðåùåíû
|
||||
PWM2->AQCTLA_bit.ZRO = 1; //îáíóëÿåì ïðè íóëå ñ÷åò÷èêà
|
||||
PWM2->AQCTLA_bit.CAU = 2; //âêëþ÷àåì ïðè ñðàâíåíèè è èíêðåìåíòèîâàíèè
|
||||
PWM2->AQCTLA_bit.CAD = 1; //îáíóëÿåì ïðè ñðàâíåíèè è äåêðåìåíòðîâàíèè
|
||||
|
||||
//Äëÿ PWMB òîæå ñàìîå, ÷òî äëÿ PWMÀ. Áåç èíâåðñèè. Èíâåðñèÿ äàëåå â ìîäóëå ÌÂ
|
||||
PWM2->AQCTLB = PWM0->AQCTLA; // äëÿ íà÷àëà ñîáûòèÿ äëÿ PWM1B çàïðåùåíû
|
||||
PWM2->AQCTLB_bit.ZRO = PWM0->AQCTLA_bit.ZRO; //îáíóëÿåì ïðè íóëå ñ÷åò÷èêà
|
||||
PWM2->AQCTLB_bit.CAU = PWM0->AQCTLA_bit.CAU; //âêëþ÷àåì ïðè ñðàâíåíèè è èíêðåìåíòèîâàíèè
|
||||
PWM2->AQCTLB_bit.CAD = PWM0->AQCTLA_bit.CAD; //îáíóëÿåì ïðè ñðàâíåíèè è äåêðåìåíòðîâàíèè
|
||||
|
||||
PWM2->AQSFRC_bit.RLDCSF = 0; //ïî ÒÎ íàäî ïèñàòü 0
|
||||
|
||||
// Active high complementary PWMs - Setup Deadband
|
||||
PWM2->DBRED = PWM0->DBRED;
|
||||
PWM2->DBFED = PWM2->DBRED;
|
||||
PWM2->DBCTL_bit.INMODE = PWM0->DBCTL_bit.INMODE;
|
||||
PWM2->DBCTL_bit.OUTMODE = PWM0->DBCTL_bit.OUTMODE;
|
||||
PWM2->DBCTL_bit.POLSEL = PWM0->DBCTL_bit.POLSEL;
|
||||
|
||||
// Interrupt where we will change the Compare Values
|
||||
PWM2->ETSEL_bit.INTSEL = ET_DISABLE; // Disable INT
|
||||
PWM2->ETSEL_bit.INTEN = 0; // Disable INT
|
||||
|
||||
// Trip-Zone
|
||||
PWM2->TZCTL_bit.TZA = TZ_STATE; // ïî ñîáûòèþ "One-Shot Trip" ïåðåâîäèì
|
||||
PWM2->TZCTL_bit.TZB = TZ_STATE; // ØÈÌ âûõîäû â íóæíîå ñîñòîÿíèå
|
||||
|
||||
|
||||
// Îòêëþ÷àåì êëþ÷è
|
||||
PWM0->TZFRC_bit.OST = 1;
|
||||
PWM1->TZFRC_bit.OST = 1;
|
||||
PWM2->TZFRC_bit.OST = 1;
|
||||
|
||||
|
||||
|
||||
//PWM0->TBCTL_bit.FREESOFT = 0;
|
||||
//ØÈÌ 6 âûâîäîâ
|
||||
GPIOA->ALTFUNCSET = (1 << 8) + (1 << 9) + (1 << 10) + (1 << 11) + (1 << 12) + (1 << 13);
|
||||
GPIOA->DENSET = (1 << 8) + (1 << 9) + (1 << 10) + (1 << 11) + (1 << 12) + (1 << 13);
|
||||
|
||||
//Ñèíõðîííûé çàïóñê ØÈÌ
|
||||
SIU->PWMSYNC_bit.PRESCRST= 0b111;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! Íîðìèðîâàíèå âõîäíûõ âåëè÷èí.
|
||||
|
||||
//!Ó÷èòûâàåò êîìïåíñàöèþ íàïðÿæåíèÿ ïðè èçìåíåíèè Ud,
|
||||
//!âûïîëíÿåò âïèñûâàíèå âåêòîðà â îêðóæíîñòü, åñëè òðåáóåòñÿ, è
|
||||
//!âûïîëíÿåò ñìåíó áàçèñà, îòíîñèòåëüíî êîòîðîãî èäåò íîðìèðîâêà.
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_NormInput(TPWM_Module* p) {
|
||||
_iq knorm;
|
||||
|
||||
p->UalphaNorm=p->UalphaRef;
|
||||
p->UbetaNorm=p->UbetaRef;
|
||||
|
||||
//íàõîäèì àìïëèòóäó (áåç ó÷åòà îãðàíè÷åíèÿ)
|
||||
p->U_mag=_IQmag(p->UalphaNorm,p->UbetaNorm);
|
||||
|
||||
|
||||
p->UdCorTmp=_IQdiv(_IQ(1.0),(_IQ(1.0)+_IQmpy((adc.Udc_meas-_IQ(1.0)),p->UdCompK)));
|
||||
//ó÷åò ïóëüñàöèé íàïðÿæåíèÿ íà Ud
|
||||
if (p->UdCompEnable&1) { //îí âêëþ÷åí?
|
||||
p->UalphaNorm=_IQmpy(p->UalphaNorm, p->UdCorTmp);//èçìåíèì ïðîïîðöèîíàëüíî êîýôô-òó êîððåêöèè
|
||||
p->UbetaNorm=_IQmpy(p->UbetaNorm, p->UdCorTmp);//è ýòî òîæå
|
||||
}
|
||||
|
||||
//âïèñûâàíèå çàäàííîé àìïëèòóäû íàïðÿæåíèÿ â îêðóæíîñòü, âïèñûâàåìóþ â øåñòèóãîëüíèê áàçûâûõ âåêòîðîâ
|
||||
//êîãäà U_lim=1.0, ýòî è åñòü òàêàÿ îêðóæíîñòü. Áûâàåò, ÷òî ìû õîòèì âïèñûâàòü â øåñòèóãîëüíèê. Òîãäà ïðîñòî çàäèðàåì ââåðõ îãðèàíè÷åíèå U_lim
|
||||
if (p->U_lim>_IQ(1.0/0.866)) //íî íåò ñìûñëà çàäèðàòü âûøå ìàêñèìàëüíî-ðåàëèç. íàïðÿæåíèÿ (áîëüøå áàçîâîãî âåêòîðà)
|
||||
p->U_lim=_IQ(1.0/0.866);
|
||||
/* ðàññ÷èòûâàåì àìïëèòóäó âåêòîðà, êîòîðûé õîòèì îòðàáîòàòü*/
|
||||
knorm=_IQmag(p->UalphaNorm,p->UbetaNorm);//ïëþñ íîðìèðóåì îò 540 ê 311
|
||||
if (knorm>=p->U_lim) { //îí áîëüøå, ÷åì íàøå îãðàíè÷åíèå?
|
||||
knorm=_IQdiv(p->U_lim,knorm);//â ýòó æå ïåðåìåííóþ, äëÿ ýêîíîìèè, ðàññ÷èòûâàåì íîðìèðîâêó
|
||||
p->UalphaNorm=_IQmpy(knorm,p->UalphaNorm);//óìåíüøàåì ïðîïîðöèîíàëüíî íîðìèðîâêå
|
||||
p->UbetaNorm=_IQmpy(knorm,p->UbetaNorm);//è ýòî
|
||||
p->ULimitation=1;//ôëàã î òîì, ÷òî èäåò îãðàíè÷åíèå íàïðÿæåíèÿ
|
||||
} else
|
||||
p->ULimitation=0;
|
||||
|
||||
/* ðàññ÷èòûâàåì ïðèâåäåííûå âåêòîðà*/
|
||||
/* Äî ýòîãî ìîìåíòà íàïðÿæåíèå íîðìèðîâàëîñü îòíîñèòåëüíî
|
||||
áàçèñà ôàçíîãî àìïëèòóäíîãî çíà÷åíèÿ, íàïðèìåð, 220*sqrt(2)
|
||||
Òåïåðü ïðîèçâîäèòñÿ ïåðåõîä, ãäå çà åäèíèöó ïðèíèìàåòñÿ ìàêñèìàëüíî
|
||||
ðåàëèçóåìîå íàïðÿæåíèå (äëèíà áàçîâîãî âåêòîðà)
|
||||
*/
|
||||
p->UalphaNorm=_IQmpy(p->UalphaNorm,_IQ(0.866));
|
||||
p->UbetaNorm=_IQmpy(p->UbetaNorm,_IQ(0.866));
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! Ôóíêöèÿ 6òè ñåêòîðíîé âåêòîðíîé ØÈÌ
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_No_SV_Update(TPWM_Module *p) {
|
||||
_iq lambda1;
|
||||
_iq lambda2;
|
||||
_iq lambda3;
|
||||
|
||||
int16 gamma;
|
||||
int16 gamma1;
|
||||
long tmp_pwm;
|
||||
|
||||
//Ïðèñâîåíèå òðåõ óñòàâîê ñðàâíåíèÿ òîëüêî åñëè ñ÷åò÷èê òàéìåðà äàëåê îò íóëÿ, ÷òîáû
|
||||
//ïðåäîòâðàòèòü ÷àñòè÷íîå ïðèìåíåíèå ñêâàæíîñòåé, ÷òî â âåêòîðíîé ØÈÌ ìîæåò áûòü êðèòè÷íî è èñïîðòèòü ïåðèîä ØÈÌ.
|
||||
DINT;
|
||||
if (PWM0->TBCTR>30) {
|
||||
PWM0->CMPA_bit.CMPA=(Uint16)p->GammaA;
|
||||
PWM1->CMPA_bit.CMPA=(Uint16)p->GammaB;
|
||||
PWM2->CMPA_bit.CMPA=(Uint16)p->GammaC;
|
||||
}
|
||||
EINT;
|
||||
|
||||
PWM_Module_NormInput(p);
|
||||
|
||||
//Ðàñ÷åò ñêâàæíîñòåé ïî ìåòîäó Èçîñèìîâà.
|
||||
//Ïîäðîáíåå ñì. äèññåðòàöèþ ×óåâà Ï.Â. http://motorcontrol.ru/wp-content/uploads/2015/11/Chuev_vector_control.pdf
|
||||
tmp_pwm = _IQmpy(_1_SQRT3,p->UbetaNorm); /*äåëèì íà êîðåíü èç 3*/
|
||||
lambda1 = _IQmpy(p->k_pwm,(p->UalphaNorm - tmp_pwm));
|
||||
lambda2 = _IQmpy(p->k_pwm,2*tmp_pwm);
|
||||
lambda3 = _IQmpy(p->k_pwm,p->UalphaNorm + tmp_pwm);
|
||||
|
||||
|
||||
if (lambda1<=0)
|
||||
if (lambda3>0) {
|
||||
gamma=lambda3;
|
||||
gamma1=-lambda1;
|
||||
p->sector=1; /*110 íà÷àëî */
|
||||
p->GammaA=p->k_pwm-gamma;
|
||||
p->GammaB=p->k_pwm-(gamma+gamma1+1);
|
||||
p->GammaC=p->k_pwm-0;
|
||||
|
||||
} else if (lambda2>0) {
|
||||
gamma=lambda2;
|
||||
gamma1=-lambda3;
|
||||
p->sector=2; /*011 íà÷àëî */
|
||||
p->GammaA=p->k_pwm-0;
|
||||
p->GammaB=p->k_pwm-(gamma+gamma1+1);
|
||||
p->GammaC=p->k_pwm-gamma1;
|
||||
/*011 íà÷àëî */
|
||||
} else if (lambda1!=0) {
|
||||
gamma=-lambda1;
|
||||
gamma1=-lambda2;
|
||||
p->sector=3; /*011 íà÷àëî */
|
||||
p->GammaA=p->k_pwm-0;
|
||||
p->GammaB=p->k_pwm-gamma;
|
||||
p->GammaC=p->k_pwm-(gamma+gamma1+1);
|
||||
/*011 íà÷àëî */
|
||||
} else {
|
||||
gamma=-lambda3;
|
||||
gamma1 = lambda1;
|
||||
p->sector= 4; /*101 íà÷àëî */
|
||||
p->GammaA=p->k_pwm-gamma1;
|
||||
p->GammaB=p->k_pwm-0;
|
||||
p->GammaC=p->k_pwm-(gamma+gamma1+1);
|
||||
/*101 íà÷àëî */
|
||||
|
||||
}
|
||||
else if (lambda2>0) {
|
||||
gamma=lambda1;
|
||||
gamma1=lambda2;
|
||||
p->sector= 0; /*110 íà÷àëî */
|
||||
p->GammaA=p->k_pwm-(gamma+gamma1+1);
|
||||
p->GammaB=p->k_pwm-gamma1;
|
||||
p->GammaC=p->k_pwm-0;
|
||||
/*110 íà÷àëî */
|
||||
} else if (lambda3<0) {
|
||||
gamma=-lambda3;
|
||||
gamma1 = lambda1;
|
||||
p->sector= 4; /*101 íà÷àëî */
|
||||
p->GammaA=p->k_pwm-gamma1;
|
||||
p->GammaB=p->k_pwm-0;
|
||||
p->GammaC=p->k_pwm-(gamma+gamma1+1);
|
||||
/*101 íà÷àëî */
|
||||
} else {
|
||||
gamma=-lambda2;
|
||||
gamma1=lambda3;
|
||||
p->sector=5; /*101 íà÷àëî */
|
||||
p->GammaA=p->k_pwm-(gamma+gamma1+1);
|
||||
p->GammaB=p->k_pwm-0;
|
||||
p->GammaC=p->k_pwm-gamma;
|
||||
/*101 íà÷àëî */
|
||||
}
|
||||
|
||||
|
||||
/*íàñûùåíèÿ */
|
||||
|
||||
if (p->GammaA<0) p->GammaA=0;
|
||||
if (p->GammaB<0) p->GammaB=0;
|
||||
if (p->GammaC<0) p->GammaC=0;
|
||||
|
||||
if (p->GammaA>p->k_pwm) p->GammaA=p->k_pwm+1;
|
||||
if (p->GammaB>p->k_pwm) p->GammaB=p->k_pwm+1;
|
||||
if (p->GammaC>p->k_pwm) p->GammaC=p->k_pwm+1;
|
||||
|
||||
//Ïðèñâîåíèå òðåõ óñòàâîê ñðàâíåíèÿ òîëüêî åñëè ñ÷åò÷èê òàéìåðà äàëåê îò íóëÿ, ÷òîáû
|
||||
//ïðåäîòâðàòèòü ÷àñòè÷íîå ïðèìåíåíèå ñêâàæíîñòåé, ÷òî â âåêòîðíîé ØÈÌ ìîæåò áûòü êðèòè÷íî è èñïîðòèòü ïåðèîä ØÈÌ.
|
||||
//Âòîðîé ðàç - ÷òîáû ïðåäîòâðàòèòü ñèòóàöèþ ñ ïîñòîÿííîé "íåçàãðóçêîé" ïðè ðàâåíñòâå ÷àñòîò ðàñ÷åòà è ØÈÌ
|
||||
DINT;
|
||||
if (PWM0->TBCTR>30) {
|
||||
PWM0->CMPA_bit.CMPA=(Uint16)p->GammaA;
|
||||
PWM1->CMPA_bit.CMPA=(Uint16)p->GammaB;
|
||||
PWM2->CMPA_bit.CMPA=(Uint16)p->GammaC;
|
||||
}
|
||||
EINT;
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ ñèíóñîèäàëüíîé ØÈÌ
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_Sin_Update(TPWM_Module *p) {
|
||||
_iq PhasePtsA;
|
||||
_iq PhasePtsB;
|
||||
_iq PhasePtsC;
|
||||
_iq knorm;
|
||||
|
||||
|
||||
p->UalphaNorm = p->UalphaRef;
|
||||
p->UbetaNorm = p->UbetaRef;
|
||||
|
||||
//íàõîäèì àìïëèòóäó (áåç ó÷åòà îãðàíè÷åíèÿ)
|
||||
p->U_mag = _IQmag(p->UalphaNorm, p->UbetaNorm);
|
||||
|
||||
/* ðàññ÷èòûâàåì àìïëèòóäó âåêòîðà, êîòîðûé õîòèì îòðàáîòàòü*/
|
||||
knorm = _IQmag(p->UalphaNorm, p->UbetaNorm);
|
||||
if (knorm >= p->U_lim) { //îí áîëüøå, ÷åì íàøå îãðàíè÷åíèå?
|
||||
knorm = _IQdiv(p->U_lim, knorm); //â ýòó æå ïåðåìåííóþ, äëÿ ýêîíîìèè, ðàññ÷èòûâàåì íîðìèðîâêó
|
||||
p->UalphaNorm = _IQmpy(knorm, p->UalphaNorm); //óìåíüøàåì ïðîïîðöèîíàëüíî íîðìèðîâêå
|
||||
p->UbetaNorm = _IQmpy(knorm, p->UbetaNorm); //è ýòî
|
||||
p->ULimitation = 1; //ôëàã î òîì, ÷òî èäåò îãðàíè÷åíèå íàïðÿæåíèÿ
|
||||
} else
|
||||
p->ULimitation = 0;
|
||||
|
||||
//Íîðìèðîâàíèå âõîäíîãî íàïðÿæåíèÿ. Òàê êàê ñèíóñîèäàëüíàÿ ØÈÌ ôîðìèðóåò íà 0.866 ìåíüøåå íàïðÿæåíèå,
|
||||
//÷åì âåêòîðíàÿ ØÈÌ (270 àìïëèòóäíîãî ôàçíîãî íàïðÿæåíèÿ âìåñòî 311Â), òî äëÿ òîãî, ÷òîáû ïðè òîì æå çàäàíèè â ïåðåìåííûõ
|
||||
//p->UalphaNorm, p->UbetaNorm ïîëó÷èëîñü òî æå ñàìîå íàïðÿæåíèå íà âûõîäå, ÷òî è â âåêòîðíîé ØÈÌ, íóæíî çàäàíèÿ óâåëè÷èòü â 1/0.866 ðàç.
|
||||
//Äåëåíèå íà äâà íóæíî äëÿ ïîñëåäóþùèõ ôîðìóë, ÷òîáû ïåðåìåíûå ìåíÿëèñü â ïîëîâèííîì îò ìàêñèìàëüíîãî äèàïàçîíå.
|
||||
p->UalphaNorm = _IQmpy(p->UalphaNorm, _IQ(1/0.866/2));
|
||||
p->UbetaNorm = _IQmpy(p->UbetaNorm, _IQ(1/0.866/2));
|
||||
|
||||
/*ôàçíîå ïðåîáðàçîâàíèå èç ñèñòåìû àëüôà, áåòòà â a,b,c */
|
||||
|
||||
PhasePtsA = _IQ(0.5) - (p->UalphaNorm);
|
||||
PhasePtsB = _IQ(0.5) - (_IQmpy(p->UbetaNorm,_IQ(0.8660254)) - (p->UalphaNorm >> 1));
|
||||
PhasePtsC = _IQ(0.5) - (-_IQmpy(p->UbetaNorm, _IQ(0.8660254)) - (p->UalphaNorm >> 1));
|
||||
|
||||
p->GammaA = _IQmpy(p->k_pwm, PhasePtsA);
|
||||
p->GammaB = _IQmpy(p->k_pwm, PhasePtsB);
|
||||
p->GammaC = _IQmpy(p->k_pwm, PhasePtsC);
|
||||
|
||||
/*íàñûùåíèÿ */
|
||||
|
||||
if (p->GammaA < 0)
|
||||
p->GammaA = 0;
|
||||
if (p->GammaB < 0)
|
||||
p->GammaB = 0;
|
||||
if (p->GammaC < 0)
|
||||
p->GammaC = 0;
|
||||
|
||||
if (p->GammaA > p->k_pwm)
|
||||
p->GammaA = p->k_pwm + 1;
|
||||
if (p->GammaB > p->k_pwm)
|
||||
p->GammaB = p->k_pwm + 1;
|
||||
if (p->GammaC > p->k_pwm)
|
||||
p->GammaC = p->k_pwm + 1;
|
||||
|
||||
|
||||
PWM0->CMPA_bit.CMPA = (Uint16) p->GammaA;
|
||||
PWM1->CMPA_bit.CMPA = (Uint16) p->GammaB;
|
||||
PWM2->CMPA_bit.CMPA = (Uint16) p->GammaC;
|
||||
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ ØÈÌ ñ ðàçäåëüíûìè ôàçàìè (äëÿ ìîäåëè SRM)
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_Separate_Update(TPWM_Module *p) {
|
||||
_iq PhasePtsA;
|
||||
_iq PhasePtsB;
|
||||
_iq PhasePtsC;
|
||||
_iq knorm;
|
||||
|
||||
p->UPhARef = _IQmpy(p->UPhARef, _IQ(0.5));
|
||||
p->UPhBRef = _IQmpy(p->UPhBRef, _IQ(0.5));
|
||||
p->UPhCRef = _IQmpy(p->UPhCRef, _IQ(0.5));
|
||||
|
||||
PhasePtsA = _IQ(0.5) - p->UPhARef;
|
||||
PhasePtsB = _IQ(0.5) - p->UPhBRef;
|
||||
PhasePtsC = _IQ(0.5) - p->UPhCRef;
|
||||
|
||||
p->GammaA = _IQmpy(p->k_pwm, PhasePtsA);
|
||||
p->GammaB = _IQmpy(p->k_pwm, PhasePtsB);
|
||||
p->GammaC = _IQmpy(p->k_pwm, PhasePtsC);
|
||||
|
||||
/*íàñûùåíèÿ */
|
||||
|
||||
if (p->GammaA < 0)
|
||||
p->GammaA = 0;
|
||||
if (p->GammaB < 0)
|
||||
p->GammaB = 0;
|
||||
if (p->GammaC < 0)
|
||||
p->GammaC = 0;
|
||||
|
||||
if (p->GammaA > p->k_pwm)
|
||||
p->GammaA = p->k_pwm + 1;
|
||||
if (p->GammaB > p->k_pwm)
|
||||
p->GammaB = p->k_pwm + 1;
|
||||
if (p->GammaC > p->k_pwm)
|
||||
p->GammaC = p->k_pwm + 1;
|
||||
|
||||
PWM0->CMPA_bit.CMPA = (Uint16) p->GammaA;
|
||||
PWM1->CMPA_bit.CMPA = (Uint16) p->GammaB;
|
||||
PWM2->CMPA_bit.CMPA = (Uint16) p->GammaC;
|
||||
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ ØÈÌ äëÿ íà÷àëüíîé çàðÿäêè áóäñòðåïíûõ êîíäåíñàòîðîâ èíâåðòîðà
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_ChargingMode(TPWM_Module *p) {
|
||||
p->GammaA = p->k_pwm;
|
||||
p->GammaB = p->k_pwm;
|
||||
p->GammaC = p->k_pwm;
|
||||
|
||||
DINT;
|
||||
if (PWM0->TBCTR > 30) {
|
||||
PWM0->CMPA_bit.CMPA = (Uint16) p->GammaA;
|
||||
PWM1->CMPA_bit.CMPA = (Uint16) p->GammaB;
|
||||
PWM2->CMPA_bit.CMPA = (Uint16) p->GammaC;
|
||||
}
|
||||
EINT;
|
||||
}
|
||||
|
||||
//! Îáùàÿ ôóíêöèÿ-îáåðòêà äëÿ ðàñ÷åòà ØÈÌ
|
||||
|
||||
//Âûçûâàþùàåò òó âåðñèþ ØÈÌ (òó ôóíêöèþ), ÷òî âûáðàíà â íàñòðîéêàõ.
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_Update(TPWM_Module *p) {
|
||||
|
||||
if (p->ChargingMode)
|
||||
PWM_Module_ChargingMode(p);
|
||||
else {
|
||||
switch (p->PWM_type) {
|
||||
case PWM_TYPE_6SECT_NO_SV: {
|
||||
PWM_Module_No_SV_Update(p);
|
||||
break;
|
||||
}
|
||||
case PWM_TYPE_SIN_PWM: {
|
||||
PWM_Module_Sin_Update(p);
|
||||
break;
|
||||
}
|
||||
case PWM_TYPE_SRD: {
|
||||
PWM_Module_Separate_Update(p);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//! Ìåäëåííûé ðàñ÷åò
|
||||
|
||||
//! Ïåðåñ÷èòûâàþòñÿ ââåäåííûå ïîëüçîâàòåëåì âåëè÷èíû
|
||||
//! Âåëè÷èíà ìåðòâîãî âðåìåíè, ÷àñòîòà ØÈÌ è ò.ï.
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_SlowCalc(TPWM_Module *p) {
|
||||
Uint16 tmp;
|
||||
//ïðîâåðêà îãðàíè÷åíèé âåëè÷èíû ìåðòâîãî âðåìåíè
|
||||
if (p->DeadBand < DEAD_BAND_MIN)
|
||||
p->DeadBand = DEAD_BAND_MIN;
|
||||
if (p->DeadBand > DEAD_BAND_MAX)
|
||||
p->DeadBand = DEAD_BAND_MAX;
|
||||
//ïåðåñ÷åò Ì èç ôîðìàòà IQ â ìêñ â òàêòû òàéìåðà íà 100ìÃö
|
||||
PWM0->DBRED = _IQ4mpy(_IQ4(100), p->DeadBand >> 20) >> 4;
|
||||
//âî âñå êëþ÷è òî æå ñàìîå
|
||||
PWM0->DBFED = PWM0->DBRED;
|
||||
|
||||
PWM1->DBFED = PWM0->DBRED;
|
||||
PWM1->DBRED = PWM0->DBRED;
|
||||
PWM2->DBFED = PWM0->DBRED;
|
||||
PWM2->DBRED = PWM0->DBRED;
|
||||
|
||||
if (p->MinGammaLimit < DEAD_BAND_MIN)
|
||||
p->MinGammaLimit = GAMMA_LIMIT_MIN;
|
||||
if (p->MinGammaLimit > DEAD_BAND_MAX)
|
||||
p->MinGammaLimit = GAMMA_LIMIT_MAX;
|
||||
PWM0->FWDTH = _IQ4mpy(_IQ4(100), p->MinGammaLimit >> 20) >> 4;
|
||||
PWM1->FWDTH = PWM0->FWDTH;
|
||||
PWM2->FWDTH = PWM0->FWDTH;
|
||||
//÷àñòîòà ØÈÌ. Ñìåíà "íà ëåòó".
|
||||
if (p->FreqPrev != p->Frequency) { //ñìåíèëè ÷àñòîòó
|
||||
DINT; //çàïðåùåíèå ïðåðûâàíèé
|
||||
//ïðîâåðêà ìàêñèìóìà/ìèíèìóìà
|
||||
if (p->Frequency < PWM_FREQ_MIN)
|
||||
p->Frequency = PWM_FREQ_MIN;
|
||||
if (p->Frequency > PWM_FREQ_MAX)
|
||||
p->Frequency = PWM_FREQ_MAX;
|
||||
//èçìåíÿåì ïåðèîä
|
||||
p->k_pwm = _IQ10div(_IQ10(SystemCoreClock/1000.0), p->Frequency << 1) >> 10; //ïåðèîä
|
||||
PWM0->TBPRD = p->k_pwm;
|
||||
//äëÿ âñåõ ñòîåê òî æå ñàìîå
|
||||
PWM1->TBPRD = p->k_pwm;
|
||||
PWM2->TBPRD = p->k_pwm;
|
||||
|
||||
|
||||
//ïîñ÷èòàåì äëèíó âûáîðêè äëÿ óñðåäíåíèÿ òîêîâ, èñõîäÿ èç ÷àñòîòû ØÈÌ
|
||||
adc.IASampleLength = (p->Frequency >> 10) / 10; //×àñòîòà ØÈÌ â ôîðìàòå 22.10, ïðèâîäèì ê èíòó è äåëèì íà 10 - ÷àñòîòó ðàñ÷åòà ñèñòåìû óïðàâëåíèÿ
|
||||
if (adc.IASampleLength > 4) //íå áîëåå 4 òî÷åê
|
||||
adc.IASampleLength = 4;
|
||||
if (adc.IASampleLength < 1) //íå ìåíåå 1 òî÷êè
|
||||
adc.IASampleLength = 1;
|
||||
adc.IBSampleLength = adc.IASampleLength;
|
||||
adc.ICSampleLength = adc.IASampleLength;
|
||||
adc.UdcSampleLength = adc.IASampleLength;
|
||||
|
||||
p->FreqPrev = p->Frequency; //ïðåäûäóùàÿ ÷àñòîòà
|
||||
EINT;
|
||||
}
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ âêëþ÷åíèÿ ØÈÌ (âêëþ÷åíèå èíâåðòîðà)
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_On(TPWM_Module *p) {
|
||||
p->Enabled = 1; //ôëàã "âêëþ÷åíî"
|
||||
|
||||
// Ñíèìàåì ïðèíóäèòåëüíóþ óñòàíîâêó âûõîäîâ
|
||||
PWM0->TZCLR_bit.OST = 1;
|
||||
PWM1->TZCLR_bit.OST = 1;
|
||||
PWM2->TZCLR_bit.OST = 1;
|
||||
}
|
||||
|
||||
//! Ôóíêöèÿ âûêëþ÷åíèÿ ØÈÌ (âûêëþ÷åíèå èíâåðòîðà)
|
||||
|
||||
//! \memberof TPWM_Module
|
||||
void PWM_Module_Off(TPWM_Module *p) {
|
||||
|
||||
p->Enabled = 0; //ôëàã "âûêëþ÷åíî"
|
||||
// Ïðèíóäèòåëüíî îáíóëèì âñå íîæêè
|
||||
PWM0->TZFRC_bit.OST = 1;
|
||||
PWM1->TZFRC_bit.OST = 1;
|
||||
PWM2->TZFRC_bit.OST = 1;
|
||||
}
|
||||
|
||||
/*@}*/
|
318
Vsrc/V_QEP.c
Normal file
318
Vsrc/V_QEP.c
Normal file
@ -0,0 +1,318 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_QEP.c
|
||||
\brief Модуль оценки скорости и положения при помощи eQEP (см. TposspeedEqep)
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup V_QEP
|
||||
@{*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "V_IQmath.h"
|
||||
#include "V_QEP.h"
|
||||
#include "math.h"
|
||||
#include "stdlib.h"
|
||||
#include "main.h"
|
||||
|
||||
#define FIRST_LAUNCH_UP 1//!< первый пуск при переходе с низкой скорости на более высокую
|
||||
#define NOT_FIRST_LAUNCH 0//!< не первый пуск
|
||||
#define SCALE_IQ_K 10
|
||||
#define LOWEST_UPSS 0
|
||||
|
||||
|
||||
//Как рассчитывать скорость -
|
||||
//Таймеров QEP между метками аппаратно
|
||||
#define SPEED_CALC_TYPE_BY_QEP 0
|
||||
//Программно по производной угла
|
||||
#define SPEED_CALC_TYPE_BY_SOFT 1
|
||||
|
||||
|
||||
//! Инициализация
|
||||
|
||||
//! \memberof TposspeedEqep
|
||||
void TposspeedEqep_init(TposspeedEqep *p) {
|
||||
|
||||
QEP->QCAPCTL_bit.UPPS = LOWEST_UPSS;
|
||||
QEP->QCAPCTL_bit.CCPS = 4;
|
||||
QEP->QDECCTL_bit.QSRC = 0; //Вкл. режим квадратурного счёта
|
||||
QEP->QEPCTL_bit.FREESOFT = 0; //Режим отладчика
|
||||
QEP->QPOSINIT = 0; //Значение счётчика положения после инициализации или положительного переполнения
|
||||
QEP->QEPCTL_bit.SWI = 1; //Сброс счётчика
|
||||
QEP->QPOSMAX = (p->resol << 2) - 1; //Максимальное значение счётчика, после чего обнуление
|
||||
if (p->Posspeed_CTL.bit.dir == 1) { //Проверка направления движения
|
||||
QEP->QDECCTL_bit.QAP = 1;
|
||||
}
|
||||
|
||||
QEP->QEPCTL_bit.QPEN = 1; //Вкл. квадратурного счётчика
|
||||
QEP->QCLR = 0xFFFF; //Отчистка всех флагов
|
||||
QEP->QEPCTL_bit.QCLM = 0; //Режим захвата - по умолчанию, по событию отработки заданного числа импульсов
|
||||
|
||||
if (p->Posspeed_CTL.bit.index_en == 1) { //если индексная метка есть
|
||||
QEP->QEPCTL_bit.PCRM = 0;
|
||||
QEP->QEINT_bit.IEL = 1;
|
||||
} else {
|
||||
QEP->QEPCTL_bit.PCRM = 1; //Режим обнуления счётчика - по максимальному значению
|
||||
}
|
||||
QEP->QWDPRD = 200000 / (1 << 2); //Ввод периода сторожевого таймера
|
||||
QEP->QEPCTL_bit.WDE = 1; //Вкл. сторожевого таймера
|
||||
|
||||
/*Расчёт вспомогательного коэффициента для расчёта скорости,
|
||||
где 15=60/4, 60 - для перевода в об/мин; 4 - для получения интерполяции разрешения датчика (1 период дает 4 фронта);
|
||||
SystemCoreClock - частота процессора*/
|
||||
p->k_low = SystemCoreClock / ((float) p->resol * p->speed_nom) * 15.0;
|
||||
//В iq формате уменьшаем число в 1<<(24-SCALE_IQ_K), где 24 - дробная часть iq, а SCALE_IQ_K - то, насколько сдвигается величина
|
||||
//с которой speedK дальше участвует в формуле
|
||||
p->speedK = _IQ(p->k_low / (1 << (24 - 10)));
|
||||
|
||||
p->resol_inv = 1.0 / ((float) p->resol);
|
||||
|
||||
//Инициализация портов ввода вывода
|
||||
GPIOB->ALTFUNCSET = (1 << 11) + (1 << 12) + (1 << 13);
|
||||
SIU->REMAPAF_bit.QEPEN = 1;
|
||||
GPIOB->DENSET = (1 << 11) + (1 << 12) + (1 << 13);//для приема ножки апп. аварии разрешаем работу ножки как цифры
|
||||
}
|
||||
|
||||
//! Функция расчёта скорости и положения, вызывается с необходимой дискретностью
|
||||
|
||||
//! \memberof TposspeedEqep
|
||||
void TposspeedEqep_Calc(TposspeedEqep *p) {
|
||||
long temp;
|
||||
//Текущее значение GPIO для отладки. Можно смотреть в осцах
|
||||
p->GPIOsValue = (GPIOB->DATA >> 12) & 3;
|
||||
|
||||
//если скорость высокая, а делитель UPEVNT не высокий
|
||||
if ((labs(p->speed_elec) > _IQ(2)) && (QEP->QCAPCTL_bit.UPPS != 5)) {
|
||||
QEP->QCAPCTL_bit.UPPS = 5; //делаем делитель UPEVNT высокий
|
||||
p->skip_counter = 2; //два такта пропустим расчет скорости
|
||||
}
|
||||
|
||||
//если скорость низкая, а делитель не низкий
|
||||
if ((labs(p->speed_elec) < _IQ(1.5)) && (QEP->QCAPCTL_bit.UPPS != LOWEST_UPSS)) {
|
||||
QEP->QCAPCTL_bit.UPPS = LOWEST_UPSS; //делаем делитель UPEVNT низкий
|
||||
p->skip_counter = 2; //два такта пропустим расчет скорости
|
||||
}
|
||||
|
||||
p->UPPS_forWatch = QEP->QCAPCTL_bit.UPPS; //для отображения UPPS наружу
|
||||
|
||||
if (p->Posspeed_CTL.bit.CmdInit == 1) { //Команда переинициализации - все обнуляем
|
||||
QEP->QEPCTL_bit.SWI = 1;
|
||||
p->Posspeed_FLG1.bit.first_theta = 1;
|
||||
p->Posspeed_FLG2.bit.pos_ident = 0;
|
||||
p->Posspeed_CTL.bit.CmdInit = 0;
|
||||
p->theta_elec = 0;
|
||||
p->Poscnt_res = 0;
|
||||
}
|
||||
p->Poscnt_resPrev=p->Poscnt_res;
|
||||
p->Poscnt_res = (unsigned long) QEP->QPOSCNT; //захват положения
|
||||
|
||||
|
||||
p->Poscnt_res16=p->Poscnt_res;//Для наблюдения на осциллографе
|
||||
p->Posspeed_FLG1.bit.PCO_tmp = QEP->QFLG_bit.PCO; //копия флага положительного переполнения счётчика
|
||||
p->Posspeed_FLG1.bit.PCU_tmp = QEP->QFLG_bit.PCU; //копия флага отрицательного переполнения счётчика
|
||||
QEP->QCLR_bit.PCO = 1; //отчистка флага положительного переполнения счётчика
|
||||
QEP->QCLR_bit.PCU = 1; //отчистка флага отрицательного переполнения счётчика
|
||||
|
||||
//перевод угла в метках на обороте в механический угол
|
||||
//Здесь расчет во float - желательно переделать в IQ
|
||||
p->theta_mech = _IQ((float )p->Poscnt_res * p->resol_inv * 0.25); //расчёт механического угла
|
||||
p->theta_mech &= 0x00FFFFFF;
|
||||
|
||||
|
||||
// Подсчёт количества полных оборотов. Через PCO и PCU получается как-то глючно
|
||||
if (p->prevThetaMech - p->theta_mech > _IQ(0.5))
|
||||
p->RevolutionCounter++;
|
||||
if (p->prevThetaMech - p->theta_mech < _IQ(-0.5))
|
||||
p->RevolutionCounter--;
|
||||
p->prevThetaMech=p->theta_mech;
|
||||
|
||||
//угол в метках без обнуления на обороте, абсолютный
|
||||
p->Poscnt_resContinouosLong=p->Poscnt_res+((QEP->QPOSMAX+1)*p->RevolutionCounter);
|
||||
p->Poscnt_resContinouosInt=p->Poscnt_resContinouosLong;//чтобы было уднобно смотреть в 16ти разрядном осциллографе
|
||||
p->Poscnt_resContinouosInt8=p->Poscnt_resContinouosLong&0xF;//чтобы видеть метки в крупном масштабе
|
||||
|
||||
|
||||
//перевод угла в метках абсолютных (не обнуляемых наобороте) в механический угол
|
||||
//на 127 оборотах всё переполнится, но для демо сгодится
|
||||
p->theta_mechContinouos = _IQ((float )p->Poscnt_resContinouosLong * p->resol_inv * 0.25); //расчёт механического угла
|
||||
p->theta_elecContinouos = p->theta_mechContinouos*p->pole_pairs+ p->AngleOffset;//электрический угол абсолютный (не обнуляемый)
|
||||
|
||||
//Расчёт электрического положения обнулемого по достижению 360 градусов
|
||||
p->theta_el_tmp = p->theta_mech*p->pole_pairs + p->AngleOffset;
|
||||
p->theta_elec = p->theta_el_tmp & 0x00FFFFFF;
|
||||
|
||||
//рассчитывать скорость аппаратно, засекая время между метками средствами QEP
|
||||
if (p->SpeedCalcType==SPEED_CALC_TYPE_BY_QEP){
|
||||
|
||||
/*Проверка на срабатывание сторожевого таймера - не пришло не единого импульса*/
|
||||
if (QEP->QFLG_bit.WTO == 1) {
|
||||
p->Posspeed_FLG1.bit.first_launch = FIRST_LAUNCH_UP; //указатель первого запуска алгоритма после срабатывания таймера
|
||||
p->speed_elec = 0; //обнуление скорости
|
||||
QEP->QCLR_bit.WTO = 1; //отчистка флага
|
||||
QEP->QWDTMR = 0; //обнуление таймера
|
||||
} else {
|
||||
/*переключение по первому запуску для инициализации*/
|
||||
if (p->Posspeed_FLG1.bit.first_launch == FIRST_LAUNCH_UP) {
|
||||
//Откл. блока захвата
|
||||
QEP->QCAPCTL_bit.CEN = 0;
|
||||
QEP->QCAPCTL_bit.CEN = 1;
|
||||
p->Posspeed_FLG1.bit.first_launch = NOT_FIRST_LAUNCH;
|
||||
}
|
||||
|
||||
p->QEPSTS=QEP->QEPSTS;//копия регистра статуса
|
||||
|
||||
if (p->QEPSTS_bit.UPEVNT == 1) { //есть событие UPEVNT, значит в таймере захвачено время
|
||||
p->Qcprdlat_tmp = QEP->QCPRD; //копия счетчика времени
|
||||
p->speed_calc_skip = 0; //пропуск расчета скорости - не пропускать
|
||||
|
||||
if (p->QEPSTS_bit.COEF == 1) { //проверка флага переполнения таймера
|
||||
p->speed_elec = 0;
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
QEP->QEPSTS = 1 << 3;
|
||||
}
|
||||
|
||||
if (p->QEPSTS_bit.CDEF == 1) { //проверка на изменения направления движения во время захвата
|
||||
p->speed_elec = 0;
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
QEP->QEPSTS = 1 << 2;
|
||||
}
|
||||
|
||||
if (p->Qcprdlat_tmp<7){//ложный фронт
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
}
|
||||
|
||||
if (p->QEPSTS_bit.QDF!=p->DirPrev){//сменилось направление движения
|
||||
p->speed_elec = 0;
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
}
|
||||
p->DirPrev=p->QEPSTS_bit.QDF;
|
||||
|
||||
if (p->skip_counter != 0) { //Сменился UPPS
|
||||
p->skip_counter--;
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
}
|
||||
|
||||
|
||||
if (p->Qcprdlat_tmp > ((1<<(32-SCALE_IQ_K-1)))) { //Счетчик 32 разряда, а драйвер предназначен для меньшего числа, определяемого SCALE_IQ_K
|
||||
p->speed_elec = 0;
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
}
|
||||
|
||||
if (!p->speed_calc_skip) { //если расчет скорости пропускать не надо
|
||||
if (p->QEPSTS_bit.QDF == 1) //в зависимости от направления движения
|
||||
p->speed_tmpIQ = _IQdiv(p->speedK, p->Qcprdlat_tmp << SCALE_IQ_K); //коэффициет скорости делется на 16ти разрядное время, подвинутое вверх на 15
|
||||
else
|
||||
p->speed_tmpIQ = -_IQdiv(p->speedK, p->Qcprdlat_tmp << SCALE_IQ_K);
|
||||
|
||||
//На сколько нужно подвинуть результат в зависимости от
|
||||
//делителей на UPEVNT и тактировании счетчика времени
|
||||
p->MoveK = QEP->QCAPCTL_bit.UPPS
|
||||
- QEP->QCAPCTL_bit.CCPS;
|
||||
|
||||
if (p->MoveK >= 0) //надо подвинуть вверх
|
||||
p->speed_tmpIQ = p->speed_tmpIQ << p->MoveK;
|
||||
else
|
||||
//вниз
|
||||
p->speed_tmpIQ = p->speed_tmpIQ >> -p->MoveK;
|
||||
p->speed_elec = p->speed_tmpIQ; //готовая скорость в формате 8.24
|
||||
}
|
||||
|
||||
QEP->QEPSTS = 1 << 7;
|
||||
}
|
||||
else if (QEP->QCTMR > QEP->QCPRD)
|
||||
{ //нет события UPEVNT, считаем по таймеру QCTMR, а не по периоду QCPRD
|
||||
p->Qcprdlat_tmp = QEP->QCTMR; //копия счетчика
|
||||
|
||||
if (p->QEPSTS_bit.COEF == 1) { //проверка флага переполнения таймера
|
||||
p->speed_elec = 0;
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
}
|
||||
|
||||
if (p->QEPSTS_bit.CDEF == 1) { //проверка на изменения направления движения во время захвата
|
||||
p->speed_elec = 0;
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
}
|
||||
if (p->Qcprdlat_tmp<7){//ложный фронт
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
}
|
||||
|
||||
if (p->Qcprdlat_tmp > ((1<<(32-SCALE_IQ_K-1)))) { //Счетчик 32 разряда, а драйвер предназначен для меньшего числа, определяемого SCALE_IQ_K
|
||||
p->speed_elec = 0;
|
||||
p->speed_calc_skip = 1; //пропустить расчет скорости
|
||||
}
|
||||
|
||||
if (!p->speed_calc_skip) { //если расчет скорости пропускать не надо
|
||||
if (p->QEPSTS_bit.QDF == 1) //в зависимости от направления движения
|
||||
p->speed_tmpIQ = _IQdiv(p->speedK, p->Qcprdlat_tmp << SCALE_IQ_K); //коэффициет скорости делется на 16ти разрядное время, подвинутое вверх на 15
|
||||
else
|
||||
p->speed_tmpIQ = -_IQdiv(p->speedK, p->Qcprdlat_tmp << SCALE_IQ_K);
|
||||
|
||||
//На сколько нужно подвинуть результат в зависимости от
|
||||
//делителей на UPEVNT и тактировании счетчика времени
|
||||
p->MoveK = QEP->QCAPCTL_bit.UPPS
|
||||
- QEP->QCAPCTL_bit.CCPS;
|
||||
|
||||
if (p->MoveK >= 0) //надо подвинуть вверх
|
||||
p->speed_tmpIQ = p->speed_tmpIQ << p->MoveK;
|
||||
else
|
||||
//вниз
|
||||
p->speed_tmpIQ = p->speed_tmpIQ >> -p->MoveK;
|
||||
p->speed_elec = p->speed_tmpIQ; //готовая скорость в формате 8.24
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//рассчитывать скорость программно через производную угла
|
||||
if (p->SpeedCalcType==SPEED_CALC_TYPE_BY_SOFT){
|
||||
//Сначала легкий фильтр на сам угол
|
||||
//0.5 и маски - это магия нечувствительности фильтра к разнице углов больше 360
|
||||
//Чтобы при обнулении угла при переходе через 360 градусов при
|
||||
//вычитании из 5 градусов 355 получилось 10 (в IQ формате)
|
||||
p->theta_finish=p->theta_finish+_IQmpy(_IQ(0.5),((p->theta_elec-p->theta_finish+_IQ(0.5))&0x00FFFFFF)-_IQ(0.5));
|
||||
p->theta_finish&=0x00FFFFFF;
|
||||
//расчитываем приращение угла
|
||||
temp = (p->theta_finish << 8) - (p->theta_start << 8);
|
||||
p->d_fi = (temp >> 8);
|
||||
p->theta_start = p->theta_finish;
|
||||
|
||||
//скорость нефильтрованная, рассчитанная из производной угла за один период
|
||||
p->speed_elec_temp=_IQmpy(p->d_fi,p->KThetaToSpeed)<<3;
|
||||
|
||||
//инерционный фильтр для скорости
|
||||
p->speed_filter.input = p->speed_elec_temp;
|
||||
p->speed_filter.calc(&p->speed_filter);
|
||||
p->speed_elec=p->speed_filter.output;
|
||||
}
|
||||
}
|
||||
|
||||
//! Функция обработки репера (событие индекса)
|
||||
|
||||
//! \memberof TposspeedEqep
|
||||
void TposspeedEqep_IndexEvent(TposspeedEqep *p) {
|
||||
p->Posspeed_FLG2.bit.pos_ident = 1;
|
||||
}
|
||||
|
||||
//! \memberof TposspeedEqep
|
||||
void TposspeedEqep_SlowCalc(TposspeedEqep *p) {
|
||||
//коэффициент перевода производной от угла (вычисляемую неизвестно в чем) в скорость
|
||||
//сдвиг на 3 чтобы результат деления не переполнил 127, потом при использовании коэфа
|
||||
//сдвинется назад на 3
|
||||
p->KThetaToSpeed=_IQdiv(_IQ(1.0),_IQmpyI32(drv_params.freq_nom,FAST_CALC_TS)<<3);
|
||||
}
|
||||
/*@}*/
|
||||
|
206
Vsrc/V_RTC_Clock.c
Normal file
206
Vsrc/V_RTC_Clock.c
Normal file
@ -0,0 +1,206 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_RTC_Clock.c
|
||||
\brief Модуль для работы с часами реального времени
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
*
|
||||
* Часы DS1340 работают в режиме слэйва и имеют 10 регимтров данных/контроля (0x0 ... 0x9).
|
||||
* Время и дата лежат в регистрах 0x0 ... 0x6.
|
||||
* Регистр контроля часов, регистр заряда акк., и регистр флагов лежат в 0x7 ... 0x9.
|
||||
* Указатель на текущий регистр можно поменять, отправив в часы соответствующий номер .
|
||||
* Чтобы прочитать что-то из часов, сначала нужно обратиться к часам в режиме записи и передать номер
|
||||
* регистра, с которого нужно считать данные. После этого снова нужно обратиться к часам, но уже
|
||||
* в режиме чтения. Тогда часы начнут слать содержимое всех регистров по очереди, начиная с того
|
||||
* регистра, адрес которого был передан в предыдущем обращении. При такой "потоковой" передаче
|
||||
* указатель на текущий регистр будет автоинкрементироваться, причем в такой последовательности
|
||||
* (предположим, был установлен адрес 0x5)
|
||||
* 0x5 -> 0x6 -> 0x7 -> 0x0 -> 0x1 -> ... -> 0x7 -> 0x0
|
||||
* Чтобы попасть в последние два регистра, нужно передать их адреса явно.
|
||||
*
|
||||
* Для того, чтобы записать в часики время, нужно проделать примерно то же самое.
|
||||
* В режиме записи отправляется сначала номер регистра, в который нужно записать что-то, а затем
|
||||
* данные, которые нужно туда положить. Указатель на регистры при потоковой передаче инкрементируется
|
||||
* так же, как и при чтении.
|
||||
*
|
||||
* Данные хранятся в двоично-десятичном формате.
|
||||
*/
|
||||
|
||||
//Закомменченные функции вверху отличаются от нижних регистрами (NT_RTC и RTC_REG). Нужны ли закомменченные - не знаю.
|
||||
#include <DSP.h>
|
||||
#include <main.h>
|
||||
// Включатель постоянного считывания времени с ЧРВ. Если дефайн закоменчен - считывание производится только при запуске, а потом
|
||||
// время считается программно. Если раскомменчен - каждую секунду время считается с часов (секунда отсчитывается в мс)
|
||||
//#define USE_RTC
|
||||
|
||||
/* Инициализация RTC */
|
||||
void RTC_Clock_Init(TRTCClock *p) {
|
||||
|
||||
}
|
||||
|
||||
/* Функция считывания текущего времени */
|
||||
void RTC_Clock_Read_Time(TRTCClock *p) {
|
||||
// Uint16 tempSec, tempMin, tempHour, tempDOW, tempDay, tempMonth, tempYear;
|
||||
//
|
||||
// /* Остановить обновление теневых регисторв */
|
||||
// NT_RTC->SHDW = 0x0;
|
||||
//
|
||||
// /* Прочитать время */
|
||||
// tempSec = NT_RTC->SECOND;
|
||||
// tempMin = NT_RTC->MINUTE;
|
||||
// tempHour = NT_RTC->HOUR;
|
||||
// tempDOW = NT_RTC->WDAY;
|
||||
// tempDay = NT_RTC->DAY;
|
||||
// tempMonth = NT_RTC->MONTH;
|
||||
// tempYear = NT_RTC->YEAR;
|
||||
//
|
||||
// /* Запустить обновление теневых регисторв */
|
||||
//// NT_RTC->SHDW = 0x80;
|
||||
//
|
||||
// // Затем нужно отформатировать пришедшие данные, т.к. они приходят в виде двоично-десятичных чисел (отстой)
|
||||
// p->second = (tempSec & 0xF) + (((tempSec & 0x70) >> 4) * 10);
|
||||
// p->minute = (tempMin & 0xF) + (((tempMin & 0x70) >> 4) * 10);
|
||||
// p->hour = (tempHour & 0xF) + (((tempHour & 0x30) >> 4) * 10);
|
||||
// p->DOW = (tempDOW & 0x7);
|
||||
// p->day = (tempDay & 0xF) + (((tempDay & 0x30) >> 4) * 10);
|
||||
// p->month = (tempMonth & 0xF) + (((tempMonth & 0x10) >> 4) * 10);
|
||||
// p->year = (tempYear & 0xF) + (((tempYear & 0xF0) >> 4) * 10);
|
||||
//
|
||||
// // Наконец, упаковка основных показателей в структурку
|
||||
// p->packed_time = ((Uint32) p->day << 27) + ((Uint32) p->month << 23)
|
||||
// + ((Uint32) p->year << 17) + ((Uint32) p->hour << 12)
|
||||
// + ((Uint32) p->minute << 6) + (Uint32) p->second;
|
||||
|
||||
}
|
||||
|
||||
/* Функция установки времени */
|
||||
void RTC_Clock_Set_Time(TRTCClock *p) {
|
||||
// // Временные переменные (секунды, минуты, часы...)
|
||||
// unsigned char tempSec, tempMin, tempHour, tempDOW, tempDay, tempMonth,
|
||||
// tempYear;
|
||||
// p->tryCounter = 0;
|
||||
//
|
||||
// // Сначала нужно распаковать дату
|
||||
// p->second = p->timeToSet & 0x3F;
|
||||
// p->minute = (p->timeToSet >> 6) & 0x3F;
|
||||
// p->hour = (p->timeToSet >> 12) & 0x1F;
|
||||
// p->year = (p->timeToSet >> 17) & 0x3F;
|
||||
// p->month = (p->timeToSet >> 23) & 0xF;
|
||||
// p->day = (p->timeToSet >> 27) & 0x1F;
|
||||
//
|
||||
// tempSec = ((p->second / 10) << 4) + ((p->second % 10) & 0xF);
|
||||
// tempMin = ((p->minute / 10) << 4) + ((p->minute % 10) & 0xF);
|
||||
// tempHour = ((p->hour / 10) << 4) + ((p->hour % 10) & 0xF);
|
||||
// tempDOW = p->DOW & 0x3;
|
||||
// tempDay = ((p->day / 10) << 4) + ((p->day % 10) & 0xF);
|
||||
// tempMonth = ((p->month / 10) << 4) + ((p->month % 10) & 0xF);
|
||||
// tempYear = ((p->year / 10) << 4) + ((p->year % 10) & 0xF);
|
||||
//
|
||||
// p->msInDay = (Uint32) p->hour * 3600000 + (Uint32) p->minute * 60000
|
||||
// + (Uint32) p->second * 1000;
|
||||
//
|
||||
// // Расчёт дня недели (пижонство)
|
||||
// int16 a = (14 - p->month) / 12;
|
||||
// int16 y = p->year - a;
|
||||
// int16 m = p->month + 12 * a - 2;
|
||||
// p->DOW = (7000 + (p->day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12))
|
||||
// % 7;
|
||||
//
|
||||
// NT_RTC->YEAR = tempYear;
|
||||
// NT_RTC->MONTH = tempMonth;
|
||||
// NT_RTC->DAY = tempDay;
|
||||
// NT_RTC->WDAY = tempDOW;
|
||||
// NT_RTC->HOUR = tempHour;
|
||||
// NT_RTC->MINUTE = tempMin;
|
||||
// NT_RTC->SECOND = tempSec;
|
||||
}
|
||||
|
||||
void RTC_Clock_Ms_Calc(TRTCClock *p) {
|
||||
p->ms++;
|
||||
p->msInDay++;
|
||||
#ifdef USE_RTC
|
||||
if (p->ms > 999) {
|
||||
p->ms = 0;
|
||||
p->readTimeFlag = 1;
|
||||
}
|
||||
|
||||
//проверка работы часов реального времени и установка, в зависимсоти от этого, указателя для банка аварий
|
||||
if (p->secondPrev == p->second) //секунда не меняется
|
||||
p->stoppedCounter++; //считаем, как долго
|
||||
else //сменилась, значит часы работают
|
||||
p->stoppedCounter = 0;
|
||||
|
||||
if ((p->stoppedCounter < RTC_SECOND_WAITING_TIMEOUT) && (p->year<48)) //часы работают - тикают и год не 2048 (как когда нет батарейки)
|
||||
p->ClockOk=1;
|
||||
|
||||
else
|
||||
{
|
||||
p->ClockOk=0;
|
||||
p->stoppedCounter = RTC_SECOND_WAITING_TIMEOUT;
|
||||
}
|
||||
p->secondPrev = p->second;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#else
|
||||
|
||||
if (p->ms == 1000) {
|
||||
p->ms = 0;
|
||||
p->second++;
|
||||
|
||||
if (p->second == 60) {
|
||||
p->second = 0;
|
||||
p->minute++;
|
||||
if (p->minute == 60) {
|
||||
p->minute = 0;
|
||||
p->hour++;
|
||||
if (p->hour == 24) {
|
||||
p->hour = 0;
|
||||
p->msInDay = 0;
|
||||
p->day++;
|
||||
}
|
||||
}
|
||||
}
|
||||
p->packed_time = ((Uint32)p->day << 27) + ((Uint32)p->month << 23) + ((Uint32)p->year << 17) +
|
||||
((Uint32)p->hour << 12) + ((Uint32)p->minute << 6) + (Uint32)p->second;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void RTC_Clock_Slow_Calc(TRTCClock *p) {
|
||||
if (p->setTimeFlag == 1) {
|
||||
p->timeToSet = p->packed_time;
|
||||
p->set(p);
|
||||
p->read(p);
|
||||
p->msInDay = (Uint32) p->hour * 3600000 + (Uint32) p->minute * 60000
|
||||
+ (Uint32) p->second * 1000;
|
||||
p->setTimeFlag = 0;
|
||||
} else if (p->readTimeFlag == 1) {
|
||||
p->read(p);
|
||||
p->readTimeFlag = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
164
Vsrc/V_SSI_Encoder.c
Normal file
164
Vsrc/V_SSI_Encoder.c
Normal file
@ -0,0 +1,164 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_SSI_Encoder.c
|
||||
\brief Модуль оценки скорости и положения при помощи цифрового энкодера, работающего по интерфейсу SSI (см. TSSI_Encoder)
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 1.0 25/04/2016
|
||||
|
||||
\addtogroup V_QEP
|
||||
@{*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "V_IQmath.h"
|
||||
#include "V_SSI_Encoder.h"
|
||||
#include "math.h"
|
||||
#include "stdlib.h"
|
||||
#include "main.h"
|
||||
|
||||
//! Инициализация
|
||||
|
||||
//! \memberof TSSI_Encoder
|
||||
void SSI_Encoder_init(TSSI_Encoder *p) {
|
||||
// volatile long delay;
|
||||
// volatile Uint32 tempREG;
|
||||
//
|
||||
// //SPI-SOMI - на VectorCard нога 88, на проце B15, SPI_RXD2
|
||||
// //SPI-SIMO - на VectorCard нога 38, на проце C6, SPI_TXD2
|
||||
// //SPI-CLK - на VectorCard нога 39, на проце B14, SPI_CLK2
|
||||
// //SPI-STE - на VectorCard нога 89, на проце B13, SPI_FSS2
|
||||
// //Плата texas DRV8301-HC-EVM разведена так, что микроконтроллер - это ведомое устройство.
|
||||
// //Нужно сделать его мастером. Подробнее читайте комментарий в заголовочном файле.
|
||||
//
|
||||
// // Настройка ног SPI
|
||||
// GPIOB->ALTFUNCSET = (1 << 13);//чип-селект
|
||||
// GPIOB->ALTFUNCSET = (1 << 14) | (1 << 15);
|
||||
// NT_GPIOC->ALTFUNCSET = (1 << 6);//SIMO
|
||||
// NT_COMMON_REG->GPIOPCTLB_bit.PIN13 = 2;//чип-селект
|
||||
// NT_COMMON_REG->GPIOPCTLB_bit.PIN14 = 2;
|
||||
// NT_COMMON_REG->GPIOPCTLB_bit.PIN15 = 2;
|
||||
// NT_COMMON_REG->GPIOPCTLC_bit.PIN6 = 2;//SIMO
|
||||
//
|
||||
//
|
||||
// // Настройка тактирования SSP модуля
|
||||
// // Всего 4 модуля, на каждый модуль по 8 бит из регистра SSP_CLK_CTRL и по два бита из UART_SSP_CLK_SEL
|
||||
//
|
||||
// // UART_SSP_CLK_SEL
|
||||
// // Во втором байте слова на каждый из 4-ёх модулей SSP отводится по два бита для выбора источника тактирования 0x0000XX00
|
||||
// // "00" - в качестве иточника тактирования модуля SSP выбирается системная частота 100 МГц, таким образом f_SSP_IN = SysClk = 100 MHz
|
||||
//
|
||||
// // SSP_CLK_CTRL
|
||||
// // Младший бит разрешает тактирование (1 - разрешить)
|
||||
// // Второй бит разрешает деление частоты f_SSP_IN источника тактового сигнала (0 - не делить, 1 - делить)
|
||||
// // Старшие шесть выбирают делитель частоты этого исотчника:
|
||||
// // X - деление по формуле SSPclk = f_SSP_IN /( 2 * (X +1) )
|
||||
// // Из документации на блок SSP - минимальная частота для работы модуля в режимах и мастер и слейв,
|
||||
// // f_SSP_IN > 22.12 MHz, поэтому 25 МГц сделаем
|
||||
// /* закомменчены, так как тоже самое делается в DRV8301_SPI
|
||||
// tempREG = NT_COMMON_REG->UART_SPI_CLK_SEL;// Через tempREG, чтобы не задеть другие биты, отвечающие за тактирование UART'a
|
||||
// tempREG &= 0xFFFF00FF;
|
||||
// NT_COMMON_REG->UART_SPI_CLK_SEL = tempREG;
|
||||
// NT_COMMON_REG->SPI_CLK = 0x07070707;// Разрешить тактирование, разрешить деление частоты, делить на 4 - 25 МГц
|
||||
// */
|
||||
//
|
||||
//
|
||||
// // Настройка самого модуля SPI
|
||||
// // Продолжение настройки тактирования.
|
||||
// // Полученная ранее частота f_SSP_IN проходит ещё через два делителя.
|
||||
// // SSPCPSR - первый делитель, в диапазоне 2 ... 254, может быть только чётным (младший бит всегда хардварно равен 0)
|
||||
// // SSPCR0.bit.SCR - второй делитель от 0 до 255.
|
||||
// // Битрейт в итоге BitRate = f_SSP_IN / ( SSPCPSR * (SCR + 1) )
|
||||
//
|
||||
// SPI2->SPI_CR1 = 0;// Режим - мастер, LoopBack отключён, сам модуль SSP тоже отключён
|
||||
// SPI2->SPI_IMSC = 0x0; // Запретить все прерывания
|
||||
// SPI2->SPI_DMACR = 0; // Запретить DMA
|
||||
// SPI2->SPI_ICR = 0x3; // Очистка прерываний ("переполнение FIFO приёма" и "необслуженное FIFO приёма")
|
||||
//
|
||||
// SPI2->SPI_CPSR = 4; // Деление входной частоты на 4 -> 6,25 MHz
|
||||
// SPI2->SPI_CR0_bit.DSS = 12; // Размер данных - 12 бит
|
||||
// SPI2->SPI_CR0_bit.SCR = 0x3F; // Второй делитель
|
||||
// SPI2->SPI_CR0_bit.FRF = 0x0; // Какая-то "фаза" для протокола Motorola SPI
|
||||
// SPI2->SPI_CR0_bit.SPH = 0x1; // Какая-то "полярность" для протокола Motorola SPI
|
||||
// SPI2->SPI_CR0_bit.SPO = 0x0; // Выбор формата кадра Motorola/TI/Microwire. "0" - по протоколу Motorola SPI
|
||||
// SPI2->SPI_CR1_bit.SSE = 1; // Разрешить работу
|
||||
//
|
||||
// p->resol_inv = 1.0 / ((float) p->resol);
|
||||
//
|
||||
// p->read(p);
|
||||
}
|
||||
|
||||
|
||||
//! Функция расчёта скорости и положения, вызывается с необходимой дискретностью
|
||||
|
||||
//! \memberof TSSI_Encoder
|
||||
void SSI_Encoder_Calc(TSSI_Encoder *p) {
|
||||
p->read(p);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SSI_Encoder_Read(TSSI_Encoder*p) {
|
||||
// _iq theta_elec_temp;
|
||||
// Uint16 Data_read=0;
|
||||
// _iq theta_mech_temp;
|
||||
//
|
||||
// if (SPI2->SPI_SR_bit.BSY == 0){//SPI свободен
|
||||
// Data_read = SPI2->SPI_DR;//код с датчика (число от 0 до resol)
|
||||
// SPI2->SPI_DR = 0xff;//отправляем что угодно, главное, чтобы тактирование шло
|
||||
//
|
||||
//
|
||||
// if (p->rotation_dir)//обратное направление вращения
|
||||
// Data_read=(p->resol-1)-Data_read;//период - текущее
|
||||
// p->Poscnt_res=Data_read;
|
||||
// }
|
||||
//
|
||||
// //перевод угла в метках на обороте в механический угол
|
||||
// //Здесь расчет во float - желательно переделать в IQ
|
||||
// p->theta_mech = _IQ((float )p->Poscnt_res * p->resol_inv); //расчёт механического угла
|
||||
// p->theta_mech &= 0x00FFFFFF;
|
||||
// //Фильтр угла
|
||||
// if (p->theta_mech_filterK!=0){
|
||||
// p->theta_mech_filtered=p->theta_mech_filtered+_IQmpy(p->theta_mech_filterK,((p->theta_mech-p->theta_mech_filtered+_IQ(0.5))&0x00FFFFFF)-_IQ(0.5));
|
||||
// p->theta_mech_filtered&=0x00FFFFFF;
|
||||
// }else
|
||||
// p->theta_mech_filtered=p->theta_mech;
|
||||
//
|
||||
// // Подсчёт количества полных оборотов.
|
||||
// if (p->prevThetaMech - p->theta_mech_filtered > _IQ(0.5))
|
||||
// p->RevolutionCounter++;
|
||||
// if (p->prevThetaMech - p->theta_mech_filtered < _IQ(-0.5))
|
||||
// p->RevolutionCounter--;
|
||||
// p->prevThetaMech=p->theta_mech_filtered;
|
||||
//
|
||||
// //угол в метках без обнуления на обороте, абсолютный
|
||||
// p->Poscnt_resContinouosLong=p->Poscnt_res+(p->resol*p->RevolutionCounter);
|
||||
// p->Poscnt_resContinouosInt=p->Poscnt_resContinouosLong;//чтобы было уднобно смотреть в 16ти разрядном осциллографе
|
||||
// p->Poscnt_resContinouosInt8=p->Poscnt_resContinouosLong&0xF;//чтобы видеть метки в крупном масштабе
|
||||
//
|
||||
// //перевод угла в метках абсолютных (не обнуляемых наобороте) в механический угол
|
||||
// //на 127 оборотах всё переполнится, но для демо сгодится
|
||||
// p->theta_mechContinouos = p->theta_mech_filtered + _IQ(p->RevolutionCounter); //расчёт механического угла
|
||||
// p->theta_elecContinouos = p->theta_mechContinouos*p->pole_pairs+ p->AngleOffset;//электрический угол абсолютный (не обнуляемый)
|
||||
//
|
||||
// //Расчёт электрического положения обнулемого по достижению 360 градусов
|
||||
// p->theta_el_tmp = p->theta_mech_filtered*p->pole_pairs + p->AngleOffset;
|
||||
// p->theta_elec = p->theta_el_tmp & 0x00FFFFFF;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
132
Vsrc/V_UserMemory.c
Normal file
132
Vsrc/V_UserMemory.c
Normal file
@ -0,0 +1,132 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_UserMemory.c
|
||||
\brief Работа с пользовательской энергонезависимой памятью 1921BK01 (см. TUserMemory)
|
||||
\author Лашкевич М.М., Шпак Д.М.
|
||||
\version v 1.0 18/12/2014
|
||||
*/
|
||||
|
||||
/** \addtogroup TUserMemory */
|
||||
/*@{*/
|
||||
|
||||
#include <V_UserMemory.h>
|
||||
#include "DSP.h"
|
||||
|
||||
|
||||
|
||||
|
||||
//!Инициализация
|
||||
|
||||
//!Инициализация USERMEMORY
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Init(TUserMemory *p)
|
||||
{
|
||||
I2C->CTL1_bit.ENABLE = 1;
|
||||
I2C->CTL1_bit.SCLFRQ = 63; // Divider: 100 000 000 / (63 * 4) ~ 400 кГц
|
||||
I2C->CTL3_bit.SCLFRQ = 0; // Divider
|
||||
|
||||
}
|
||||
|
||||
|
||||
//! Проверка, не нужно ли сменить страницу
|
||||
|
||||
//! Проверяет текущий адрес на флешке, с которым работает пользователь. Если адрес вышел из текущей страницы, страница записывается на флеш и читается в RAM новый
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_UpdateCurrentPage(TUserMemory *p, Uint16 spiaddr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
//! Запись в память
|
||||
|
||||
//!Медленная функция, записывающая на flash заданные данные.
|
||||
//!Работает с закешированными в оперативке данными, а физическ пишет на флеш только если адрес вылез за границы текущей страницы
|
||||
|
||||
//! Адрес во флеше spiaddr, адрес 16ти разрядных данных пользователя startaddr, размер data_length. Все в байтах
|
||||
//! При выполении операции startaddr инкрементируется, а spiaddr нет
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Write(TUserMemory *p)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
//! Чтение из памяти
|
||||
|
||||
//!Медленная функция, считывающая из flash заданные данные. Подробности см. TUserMemory.
|
||||
|
||||
//! Адрес во флеше spiaddr, адрес адрес 16ти разрядных данных пользователя startaddr, размер data_length. Все в байтах.
|
||||
//! При выполении операции startaddr инкрементируется, а spiaddr нет
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Read(TUserMemory *p)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
//! Записывает страницу данные на флешку из кеша (из оперативки одну страницу)
|
||||
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_WriteFromCache(TUserMemory *p, int16 pageNum)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! Читает страницу данных из флеша в кеш (в оперативку)
|
||||
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_ReadToCache(TUserMemory *p, int16 pageNum)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
//! Стереть всю флешку (будут FF)
|
||||
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Full_Erase(TUserMemory *p){
|
||||
|
||||
}
|
||||
|
||||
|
||||
//! Сбросить кеш из оперативки на флешку
|
||||
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_Flush(TUserMemory *p){
|
||||
}
|
||||
|
||||
//! Медленный фоновый постоянный расчет - нужен пока для систематического сброса кеша на флешку по времени
|
||||
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_slow_calc(TUserMemory *p){
|
||||
// }
|
||||
}
|
||||
|
||||
//! Миллисекундный расчет - нужен пока для систематического сброса кеша на флешку по времени
|
||||
|
||||
//! \memberof TUserMemory
|
||||
void USERMEMORY_ms_calc(TUserMemory *p){
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
185
Vsrc/V_adc.c
Normal file
185
Vsrc/V_adc.c
Normal file
@ -0,0 +1,185 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_adc.c
|
||||
\brief Модуль обработки АЦП (см. TAdcDrv)
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup V_adc
|
||||
@{*/
|
||||
|
||||
|
||||
#include "main.h"
|
||||
|
||||
//!Инициализация.
|
||||
|
||||
//! Настраиваются секвенсоры и тип оцифровки данных. каналы для оцифровки, частота.
|
||||
//! В данном случае оцифровка происходит по событию таймера,частота которого
|
||||
//! равна частоте ШИМ, чтобы измерять ровно посередине периода ШИМ (требуется для шунтовых
|
||||
//! датчиков тока)
|
||||
//Запуск оцифровки производится по таймеру NT_PWM3, который синхронизирован с другими таймерами ШИМ.
|
||||
//Оцифрованные измерения складываются в ФИФО. Каждый канал АЦП настроен на отдельный секвенсор с ФИФО длиной до 16 измерений.
|
||||
//В прерывании с частотой 10 кГц данные забираются из ФИФО и складываются в кольцевые массивы (старые затираются новыми).
|
||||
//В том же прерывании из кольцевого массива берется N последних точек и из них вычисляется среднее арифметическое.
|
||||
//Число выборок для усреднения N зависит от частоты ШИМ и равна Fшим/10кГц. Если частоты ШИМ меньше 10 кГц, то берется одна выборка, если больше 40 кГц - 4 выборки.
|
||||
//К вычисленному среднему значению добавляется калибровочный сдвиг, и оно умножается на коэффициент измерения, в результате получается окончательный результат измерения.
|
||||
|
||||
//! \memberof TAdcDrv
|
||||
void AdcDrv_init(TAdcDrv *p) {
|
||||
PWM0->ETSEL_bit.SOCAEN = 1;
|
||||
PWM0->ETSEL_bit.SOCASEL = ET_CTR_ZERO;
|
||||
PWM0->ETPS_bit.SOCAPRD = 2;
|
||||
|
||||
Uint32 AdcClock, AdcDiv, trash;
|
||||
Uint32 pwmPrd = PWM0->TBPRD; // Предположим, частота 10 кГц
|
||||
|
||||
if (pwmPrd < 1000) pwmPrd = 1000;
|
||||
//Инициализация ADC
|
||||
RCU->ADCCFG_bit.CLKSEL = RCU_ADCCFG_CLKSEL_PLLCLK; // Тактирование от PLL
|
||||
RCU->ADCCFG_bit.DIVN = 0x1; // N = 2 * (DIVN + 1) = 4 -> ACLK = 25 MHz
|
||||
RCU->ADCCFG_bit.DIVEN = 0x1; // Разрешить делитель
|
||||
AdcDiv = 2 * (RCU->ADCCFG_bit.DIVN + 1); // Итого деление частоты
|
||||
AdcClock = SystemCoreClock / AdcDiv;
|
||||
RCU->ADCCFG_bit.CLKEN = 0x1; // Разрешить тактирование
|
||||
RCU->ADCCFG_bit.RSTDIS = 0x1; // Снимаем сброс
|
||||
ADC->ACTL_bit.ADCEN = 0x1; // Разрешаем работу АЦП
|
||||
|
||||
//Настройка секвенсора 0
|
||||
// CH0, CH1, CH2, CH3.
|
||||
ADC->EMUX_bit.EM0 = ADC_EMUX_EM0_PWM012A; // Запуск от таймера
|
||||
ADC->SEQSYNC = ADC_SEQSYNC_SYNC0_Msk; // Разрешить секвенсор SEQ0
|
||||
ADC->SEQ[0].SRQCTL_bit.RQMAX = 0x3; // Опрашивать 4 канала за раз = RQMAX + 1
|
||||
ADC->SEQ[0].SRQSEL_bit.RQ0 = 0x0; // Какой вход АЦП когда опрашивается
|
||||
ADC->SEQ[0].SRQSEL_bit.RQ1 = 0x1; // --//--
|
||||
ADC->SEQ[0].SRQSEL_bit.RQ2 = 0x2; // --//--
|
||||
ADC->SEQ[0].SRQSEL_bit.RQ3 = 0x3; // --//--
|
||||
ADC->SEQ[0].SCCTL_bit.RCNT = 3; // Делать ещё три перезапуска после первого запуска
|
||||
ADC->SEQ[0].SRTMR_bit.VAL = (pwmPrd / AdcDiv) / (ADC->SEQ[0].SCCTL_bit.RCNT + 1); // Пауза между пусами АЦП на период ШИМ
|
||||
ADC->SEQ[0].SCCTL_bit.ICNT = 3; // Вызов прерывания через каждые (ICNT + 1) оцифровки
|
||||
ADC->SEQ[0].SCCTL_bit.RAVGEN = 1; // Разрешить усреднять по 4 точкам
|
||||
ADC->SEQEN_bit.SEQEN0 = 1; // Разрешить секвенсор 0
|
||||
|
||||
|
||||
// Очистка FIFO
|
||||
while (ADC->SEQ[0].SFLOAD)
|
||||
trash = ADC->SEQ[0].SFIFO;
|
||||
|
||||
// Разрешить EPWM0 запускать АЦП по нулю
|
||||
|
||||
|
||||
// Ждём, пока АЦП выставит флаг "ГОТОВ" (можно вставить этот цикл после "ADCEN = 1")
|
||||
while (!ADC->ACTL_bit.ADCRDY) {};
|
||||
|
||||
// Разрешить прерывание от первого секвенсера
|
||||
ADC->IM_bit.SEQIM0 = 1;
|
||||
NVIC_EnableIRQ(ADC_SEQ0_IRQn);
|
||||
NVIC_SetPriority(ADC_SEQ0_IRQn, IRQ_PRIORITY_ADC);
|
||||
}
|
||||
|
||||
|
||||
//!Расчет АЦП с частотой основного расчета всей системы управления (обычно 10кГц).
|
||||
|
||||
//! Занимается обработкой измеренных АЦП значений и преобразует в формат IQ24.
|
||||
//! Токи фаз для повышения точности усредняются за несколько измерений
|
||||
|
||||
//! \memberof TAdcDrv
|
||||
|
||||
void AdcDrv_fast_calc(TAdcDrv *p) {
|
||||
Uint32 trash;
|
||||
// Если всё пошло хорошо, то в ФИФЕ будут уже усреднённые результаты - 4 штуки.
|
||||
p->IA_temp = ADC->SEQ[0].SFIFO;
|
||||
p->IB_temp = ADC->SEQ[0].SFIFO;
|
||||
p->Udc_temp = ADC->SEQ[0].SFIFO;
|
||||
p->T_temp = ADC->SEQ[0].SFIFO;
|
||||
// Очистка FIFO на случай, если почему-то там оказалось больше чем надо значений (бывает после остановки житагом)
|
||||
while (ADC->SEQ[0].SFLOAD)
|
||||
trash = ADC->SEQ[0].SFIFO;
|
||||
|
||||
p->Imeas_a = p->IaGainNom * (((p->IA_temp<< 4) + p->Imeas_a_offset));
|
||||
p->Imeas_b = p->IbGainNom * (((p->IB_temp<< 4) + p->Imeas_b_offset));
|
||||
p->Udc_meas = p->UdcGainNom * (p->Udc_temp + p->Udc_meas_offset);
|
||||
p->Imeas_c = -p->Imeas_a - p->Imeas_b;
|
||||
|
||||
//ADC->SEQ[0].SCCTL_bit.RAVGEN ^= 1;
|
||||
}
|
||||
|
||||
//!Медленный расчет.
|
||||
|
||||
//!Занимается пересчетом коэффициентов, используемых в скоростной функции расчета,
|
||||
//!чтобы не занимать процессорное время там. Находит коэффициенты,
|
||||
//!на которые надо умножить полученное с АЦП значение, чтобы получить
|
||||
//!относительные единицы с заданной базой.
|
||||
|
||||
//! Пример p->PvalveGainNom=_IQ16mpy(p->Pvalve_gain,_IQ(1.0/100));
|
||||
//! Pvalve_gain - значение в формате int. задается пользователем в UniCON.
|
||||
//!Определяет, скольким процентам соответствует полный диапазон АЦП. В простейшем случае
|
||||
//!равен 100. Т.е. когда на АЦП максимальный сигнал, это соответствует 100%.
|
||||
|
||||
//!_IQ(1.0/100) обратное значение для масштабирующего коэффициента. Так как величину процентов
|
||||
//!естественнее всего перевести в относительные единицы так, что 100% соответствут 1.0,
|
||||
//!то масштабирующий коэффициент (база) равен 100. Т.е. UniCON, прочитав из системы управления
|
||||
//! число 1.0 в формате 8.24 должен умножить его на 100, чтобы отобразились проценты.
|
||||
//! Здесь коэффициент задан явно как 1.0/100, но для ряда случаев базовое значение нужно менять.
|
||||
//!Так, для токов фаз используется значение _1_I_nom, в формате 8.24, соответствующее единице деленной на
|
||||
//базовое значение тока, например, 200 А. Так как в зависимости от мощности преобразователя базовый ток может меняться,
|
||||
//то это значение, в отличие от процентов, сделано настраиваемым. Расчет _1_I_nom идет в другом месте, так как
|
||||
//занимает много тактов расчета.
|
||||
|
||||
//Для беззнакового значения АЦП измеряет число от 0 до 65535. (16 разрядов, где заполнены верхние).
|
||||
//Для примера с процентами необходимо сделать так, чтобы получилось результирующее значение в формате 8.24,
|
||||
//где 1.0 это 65535. Таким образом, нужно сдвинуть число 65535 на 24-16=8 разрядов.
|
||||
//Сдвиг на 8 разрядов - это умножение на число 255. Число 255 - это 1.0 в формате 24.8.
|
||||
|
||||
//Таким образом, PvalveGainNom - это коэффициент в формате 24.8. он получается в результате использования функции
|
||||
//_IQ16mpy, аргумены которой Pvalve_gain (int) и 1.0/100 в формате 8.24. Функция IQ множения
|
||||
//по сути представляет собой обычное оуможение в 64 разрядах со сдвигом результата вправо на Q разрядов.
|
||||
//Т.е. _IQ16mpy умножает число в формате IQ24 9второй аргумент) на целочисленный коэффициент (первый аргумент),
|
||||
//а потом сдвигате результат на 16 разрядов вправо.
|
||||
//Так, в результате _IQ16mpy(p->Pvalve_gain,_IQ(1.0/100)); получается целочисленное число 255, являющейся
|
||||
//1.0 в формате 24.8 из-за сдвига на 16 разрядов вправо.
|
||||
|
||||
//Всё вышеприведенное мутево сделано с одной целью - увеличить производитлеьность обработки АЦП.
|
||||
|
||||
//! \memberof TAdcDrv
|
||||
void AdcDrv_slow_calc(TAdcDrv *p) {
|
||||
// Пересчёт пауз между перезапусками
|
||||
volatile Uint16 pwmPrd = PWM0->TBPRD;
|
||||
|
||||
// Если считает вверх-вниз, то период на деле в два раза больше
|
||||
if (PWM0->TBCTL_bit.CTRMODE == TB_COUNT_UPDOWN)
|
||||
pwmPrd = pwmPrd << 1;
|
||||
|
||||
// Делитель частоты АЦП
|
||||
Uint16 AdcDiv = 2 * (RCU->ADCCFG_bit.DIVN + 1);
|
||||
if (pwmPrd < 1000) pwmPrd = 1000;
|
||||
|
||||
ADC->SEQ[0].SRTMR_bit.VAL = (pwmPrd / AdcDiv) / (ADC->SEQ[0].SCCTL_bit.RCNT + 1);
|
||||
|
||||
p->IaGainNom = _IQ16mpy(p->Imeas_a_gain, drv_params._1_I_nom) << 1;
|
||||
p->IbGainNom = _IQ16mpy(p->Imeas_b_gain, drv_params._1_I_nom) << 1;
|
||||
p->IcGainNom = _IQ16mpy(p->Imeas_c_gain, drv_params._1_I_nom) << 1;
|
||||
p->UdcGainNom = _IQ16mpy(p->Udc_meas_gain, drv_params._1_Udc_nom) << 4;
|
||||
}
|
||||
|
||||
//! Миллисекундный расчет
|
||||
|
||||
//! \memberof TAdcDrv
|
||||
void AdcDrv_ms_calc(TAdcDrv *p) {
|
||||
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
72
Vsrc/V_bits_to_enum_numbers.c
Normal file
72
Vsrc/V_bits_to_enum_numbers.c
Normal file
@ -0,0 +1,72 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_bits_to_enum_numbers.c
|
||||
\brief Ìîäóëü "ëèñòàíèÿ" áèòîâûõ ïåðåìåííûõ (ñì. TBitsToEnumNums)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup V_bits_to_enum_numbers */
|
||||
/*@{*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "V_bits_to_enum_numbers.h"
|
||||
|
||||
//! Ïðåîáðàçóåò áèòîâûå ïåðåìåííûå â ÷èñëà
|
||||
|
||||
//!Òðåáóåòñÿ â îñíîâíîì äëÿ ìîäóëÿ çàùèò èëè ïðåäóïðåæäåíèé,
|
||||
//!äëÿ ïðåîáðàçîâàíèÿ âûñòàâëåííûõ áèò àâàðèè â ñëîâàõ àâàðèè â
|
||||
//!ïîðÿäêîâûé íîìåð ýòèõ áèò è "ëèñòàíèÿ" ýòèõ íîìåðîâ ñ îïðåäåëåííîé
|
||||
//!÷àñòîòîé, åñëè âûñòàâëåíî íåñêîëüêî áèò. Òàêîå ïðåîáðàçîâàíèå íóæíî äëÿ
|
||||
//!óäîáñòâà íàáëþäåíèÿ àâàðèé/ïðåäóïðåæäåíèé ïîëüçîâàòåëåì.
|
||||
//!Âûçûâàòü íåîáõîäèìî ñ îïðåäåëåííîé äèñêðåòèçàöèåé (íàïðèìåð, 10êÃö).
|
||||
//! \memberof TBitsToEnumNums
|
||||
void BitsToEnumNums(TBitsToEnumNums* p) {
|
||||
Uint16 i;
|
||||
|
||||
p->counter++;
|
||||
if (p->counter < p->out_refresh_devisor)
|
||||
return;
|
||||
p->counter = 0;
|
||||
|
||||
//ïðîâåðêà ïðàâèëüíîñòè âûçîâà
|
||||
if ((p->num_of_words > NUM_OF_W_PTRS) || (p->num_of_words == 0))
|
||||
return;
|
||||
|
||||
//ïåðåáèðàåì áèòû â ïîðÿäêå âîçðàñòàíèÿ
|
||||
for (i = 0; i < (16 * p->num_of_words); i++) {
|
||||
p->last_bit++;
|
||||
if (p->last_bit > 15) {
|
||||
p->last_bit = 0;
|
||||
p->last_word++;
|
||||
if (p->last_word > (p->num_of_words - 1))
|
||||
p->last_word = 0;
|
||||
}
|
||||
//äåëàåì ïðîâåðêó áèòà
|
||||
if ((*(p->w_ptrs[p->last_word])) & (0x1 << p->last_bit)) {
|
||||
//áèòèê èìååòñÿ âûâîäèì ðåçóëüòàò
|
||||
p->output = p->last_word * 16 + p->last_bit + 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//åñëè äîøëè äî ñþäà çíà÷èò íåò áèòèêîâ, ïîòîìó âûäàåì 0
|
||||
p->output = 0;
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
281
Vsrc/V_data_log.c
Normal file
281
Vsrc/V_data_log.c
Normal file
@ -0,0 +1,281 @@
|
||||
/*!
|
||||
\file v_data_log.c
|
||||
\brief 4-х канальный логгер длЯ осциллографированиЯ в реальном времени TDataLog (см. TDataLog)
|
||||
|
||||
\author Коллектив ООО НПФ Вектор
|
||||
\version v 2.01 18/09/2012
|
||||
*/
|
||||
|
||||
/** \addtogroup v_data_log */
|
||||
/*@{*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "co_ODvars.h"
|
||||
#include "V_data_log.h"
|
||||
#include "CANOpen_drv.h"
|
||||
|
||||
//! Фоновый обработчик.
|
||||
|
||||
/*! работает в фоне. Нужно длЯ установки адресов переменных через CAN.
|
||||
если нет CAN, можно записать нужные адреса вручную в TDataLog.dlog_iptr */
|
||||
//! \memberof TDataLog
|
||||
void dlog_background_analizer(TDataLog *p) {
|
||||
//перевод длины предыстории из % в точки
|
||||
p->trig_shift_int = (p->trig_shift&0xFFFFFF)>>16; //делаем количество точек
|
||||
if (p->trig_shift_int > 255) //ограничим
|
||||
p->trig_shift_int = 255;
|
||||
|
||||
unsigned char mode;
|
||||
|
||||
//если не стоит хоть один из первых шести бит control,
|
||||
//то ничего анализировать и делать не надо
|
||||
if (!(p->control & 0x3F))
|
||||
return;
|
||||
//В любом случае перед всеми изменениЯми
|
||||
//тормозим даталоггер. Иначе он может начать записывать данные по прерыванию,
|
||||
//пока тут, в фоне, идет, скажем, запись адресов.
|
||||
//И тогда в лучшем случае будет каша из данных, в худшем - останов контроллера
|
||||
//при обращении по неправильному адресу.
|
||||
p->mode_reset = 0;
|
||||
p->valid_points_num = 0; //т.к. даталоггер останавливался (mode = 0), то предыстория неактуальна, т.к.
|
||||
//1) за время стопа даталоггера между записанной предысторией и новыми данными будет разрыв по времени и
|
||||
//2) выбранные записываемые переменные вообще могли смениться и предыстория останется от старых, а новые данные - от новых
|
||||
//спрашиваем адреса у драйвера CANopen
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
if (p->control & 1)
|
||||
if (!(p->dlog_iptr1 = (type_data*)co_getAddr(p->pco_vars, p->ind_subind1))) //если адрес=0
|
||||
p->dlog_iptr1 = (type_data*)&p->ind_subind1; //пусть указывает на ind_subind
|
||||
if (p->control & 2)
|
||||
if (!(p->dlog_iptr2 = (type_data*)co_getAddr(p->pco_vars, p->ind_subind2)))
|
||||
p->dlog_iptr2 = (type_data*)&p->ind_subind2;
|
||||
if (p->control & 4)
|
||||
if (!(p->dlog_iptr3 = (type_data*)co_getAddr(p->pco_vars, p->ind_subind3)))
|
||||
p->dlog_iptr3 = (type_data*)&p->ind_subind3;
|
||||
if (p->control & 8)
|
||||
if (!(p->dlog_iptr4 = (type_data*)co_getAddr(p->pco_vars, p->ind_subind4)))
|
||||
p->dlog_iptr4 = (type_data*)&p->ind_subind4;
|
||||
#endif
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
if (p->control & 1)
|
||||
{
|
||||
if (co_getObjectInfo(p->pco_vars, p->ind_subind1, (TObjectInfo*)&p->object1Info) == 0)
|
||||
{
|
||||
p->object1Info.varAddr = (void*)(&p->ind_subind1);
|
||||
p->object1Info.varSize = 32;
|
||||
}
|
||||
}
|
||||
if (p->control & 2)
|
||||
{
|
||||
if (co_getObjectInfo(p->pco_vars, p->ind_subind2, (TObjectInfo*)&p->object2Info) == 0)
|
||||
{
|
||||
p->object2Info.varAddr = (void*)(&p->ind_subind2);
|
||||
p->object2Info.varSize = 32;
|
||||
}
|
||||
}
|
||||
if (p->control & 4)
|
||||
{
|
||||
if (co_getObjectInfo(p->pco_vars, p->ind_subind3, (TObjectInfo*)&p->object3Info) == 0)
|
||||
{
|
||||
p->object3Info.varAddr = (void*)(&p->ind_subind3);
|
||||
p->object3Info.varSize = 32;
|
||||
}
|
||||
}
|
||||
if (p->control & 8)
|
||||
{
|
||||
if (co_getObjectInfo(p->pco_vars, p->ind_subind4, (TObjectInfo*)&p->object4Info) == 0)
|
||||
{
|
||||
p->object4Info.varAddr = (void*)(&p->ind_subind4);
|
||||
p->object4Info.varSize = 32;
|
||||
}
|
||||
}
|
||||
p->highPartOfValue = 0;
|
||||
#endif
|
||||
p->WriteDelimiter = (p->control >> 16) & 0xFF; //прореживание. ОграничиваетсЯ 8ю битами
|
||||
mode = (p->control >> 4) & 3; //режим - 2 бита
|
||||
p->control = 0; //все обработали, обнулЯем, чтобы при след. вызове не начать обрабатывать снова
|
||||
dlog_set_mode(mode, p); //длЯ установки режима вызываетсЯ спец. функциЯ. НапрЯмую нельзЯ
|
||||
|
||||
}
|
||||
|
||||
//! функциЯ длЯ установки mode_reset.
|
||||
|
||||
//! предполагаетсЯ длЯ управлениЯ логгером из других модулей
|
||||
//! проверЯет mode_reset на валидность и обнулЯет счетчики
|
||||
//! \memberof TDataLog
|
||||
|
||||
void dlog_set_mode(Uint16 mode_reset, TDataLog *p) {
|
||||
if (mode_reset > 3)
|
||||
return;
|
||||
//в 1 переводим только если текущий режим 2, чтоб синхронизироватьсЯ
|
||||
//по первому событию (очень полезно когда событий много)
|
||||
if (p->OneShotOperation == 1) {
|
||||
if ((mode_reset == 1)) {
|
||||
if (p->mode_reset == 2)
|
||||
p->mode_reset = mode_reset;
|
||||
else
|
||||
return;
|
||||
}
|
||||
} else
|
||||
p->mode_reset = mode_reset;
|
||||
|
||||
if (mode_reset == 3) //Хотим перейти в режим однократной записи 1024 точек.
|
||||
p->Wcounter = 0; //в этом режиме нужно писать с первой точки первого массива. Сбрасываем счетчик.
|
||||
|
||||
|
||||
//при смене режима в любом случае сбрасываем флаг "данные готовы"
|
||||
p->control &= ~(1 << 6);
|
||||
p->WriteDelimiterCounter = 0;
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
p->highPartOfValue = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
//! Записывает очередные точки в массивы осциллограммы.
|
||||
|
||||
//!Должна вызыватьсЯ с заданной дискретизацией и занимаетсЯ записью массивов,
|
||||
//! т.е. непосредственно осциллографированием. Умеет записывать данные
|
||||
//! в массивы по-разному в зависимости от выбранного режима работы осциллографа
|
||||
//! \memberof TDataLog
|
||||
|
||||
void data_log_update(TDataLog *p) {
|
||||
//везде испоьзуетсЯ p-> , а не p* - так быстрее
|
||||
|
||||
//прореживание данных. Если не достигли уставки WriteDelimiter, выходим
|
||||
//WriteDelimiter=1 - не делим
|
||||
//WriteDelimiter=2 - берем каждую вторую
|
||||
if ((p->WriteDelimiterCounter++ + 1) < p->WriteDelimiter)
|
||||
return;
|
||||
else
|
||||
p->WriteDelimiterCounter = 0;
|
||||
|
||||
if (p->mode_reset != p->mode_reset_prev) p->E=1;
|
||||
else p->E=0;
|
||||
p->mode_reset_prev = p->mode_reset;
|
||||
|
||||
switch (p->mode_reset) {
|
||||
case 0: {
|
||||
p->Wcounter = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
case 1: //однократнаЯ запись - дошли до конца и стоп (режим 0)
|
||||
{
|
||||
//При входе в режим получаем точку срабатывания триггера (это текущий Wcounter, с которым мы сюда зашли) и рассчитываем первую точку, относящуюся к данной осце (исходя из текущей точки и заданной длины предыстории)
|
||||
if (p->E==1)
|
||||
{
|
||||
p->prehistory_length = p->valid_points_num; //длина предыстории равна количеству валидных точек
|
||||
if (p->prehistory_length > p->trig_shift_int) //если предыстория длиннее заданного, ограничим
|
||||
p->prehistory_length = p->trig_shift_int;
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
p->Wcounter &= 0xFE;
|
||||
p->prehistory_length &= 0xFE;
|
||||
p->first_point_written = (p->Wcounter - p->prehistory_length) & 0xFE;
|
||||
#endif
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
p->first_point_written = (p->Wcounter - p->prehistory_length) & 0xFF;
|
||||
p->highPartOfValue = 0;
|
||||
#endif
|
||||
}
|
||||
p->Wcounter &= 0xFF; //защита - если вдруг в counter не валидное значение
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
p->dl_buffer1_adr[p->Wcounter] = *p->dlog_iptr1;
|
||||
p->dl_buffer2_adr[p->Wcounter] = *p->dlog_iptr2;
|
||||
p->dl_buffer3_adr[p->Wcounter] = *p->dlog_iptr3;
|
||||
p->dl_buffer4_adr[p->Wcounter] = *p->dlog_iptr4;
|
||||
#endif
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
p->dl_buffer1_adr[p->Wcounter] = p->object1Info.varSize == 16 ?
|
||||
*((int16*)p->object1Info.varAddr) : *((int32*)p->object1Info.varAddr);
|
||||
p->dl_buffer2_adr[p->Wcounter] = p->object2Info.varSize == 16 ?
|
||||
*((int16*)p->object2Info.varAddr) : *((int32*)p->object2Info.varAddr);
|
||||
p->dl_buffer3_adr[p->Wcounter] = p->object3Info.varSize == 16 ?
|
||||
*((int16*)p->object3Info.varAddr) : *((int32*)p->object3Info.varAddr);
|
||||
p->dl_buffer4_adr[p->Wcounter] = p->object4Info.varSize == 16 ?
|
||||
*((int16*)p->object4Info.varAddr) : *((int32*)p->object4Info.varAddr);
|
||||
#endif
|
||||
p->Wcounter++;
|
||||
p->Wcounter &= 0xFF; //если прошли 256 точек, обнулитсЯ
|
||||
if (p->Wcounter == p->first_point_written) //если дошли до последней записываемой точки
|
||||
{
|
||||
p->mode_reset = 0; //режим СТОП
|
||||
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
p->control |= 192; // "данные готовы" + "поддерживается блочная передача"
|
||||
#else
|
||||
p->control |= 192 | (1 << 8); // "данные готовы" + "поддерживается блочная передача" + "32-битные данные"
|
||||
#endif
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
case 2: //записываем лог по кругу
|
||||
{
|
||||
if (p->E == 1)
|
||||
{
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
p->highPartOfValue = 0;
|
||||
#endif
|
||||
}
|
||||
p->valid_points_num++; //считаем количество записанных валидных точек предыстории
|
||||
if (p->valid_points_num > 256) //ограничиваем
|
||||
p->valid_points_num = 256;
|
||||
p->Wcounter &= 0xFF; //защита - если вдруг в counter не валидное значение
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
p->dl_buffer1_adr[p->Wcounter] = *p->dlog_iptr1;
|
||||
p->dl_buffer2_adr[p->Wcounter] = *p->dlog_iptr2;
|
||||
p->dl_buffer3_adr[p->Wcounter] = *p->dlog_iptr3;
|
||||
p->dl_buffer4_adr[p->Wcounter] = *p->dlog_iptr4;
|
||||
#endif
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
p->dl_buffer1_adr[p->Wcounter] = p->object1Info.varSize == 16 ?
|
||||
*((int16*)p->object1Info.varAddr) : *((int32*)p->object1Info.varAddr);
|
||||
p->dl_buffer2_adr[p->Wcounter] = p->object2Info.varSize == 16 ?
|
||||
*((int16*)p->object2Info.varAddr) : *((int32*)p->object2Info.varAddr);
|
||||
p->dl_buffer3_adr[p->Wcounter] = p->object3Info.varSize == 16 ?
|
||||
*((int16*)p->object3Info.varAddr) : *((int32*)p->object3Info.varAddr);
|
||||
p->dl_buffer4_adr[p->Wcounter] = p->object4Info.varSize == 16 ?
|
||||
*((int16*)p->object4Info.varAddr) : *((int32*)p->object4Info.varAddr);
|
||||
#endif
|
||||
p->Wcounter++;
|
||||
p->Wcounter &= 0xFF; //если прошли 256 точек, обнулитсЯ
|
||||
return;
|
||||
}
|
||||
|
||||
case 3: //режим однократной записи 1024 точек
|
||||
{
|
||||
if (p->E==1)
|
||||
{
|
||||
p->first_point_written = 0; //пишем с первой точки, предыстория не нужна.
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
p->highPartOfValue = 0;
|
||||
#endif
|
||||
}
|
||||
//с учетом того, что буферы в памЯти расположены последовательно,
|
||||
//записываем в первый, "заезжаЯ" на остальные три
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
p->dl_buffer1_adr[p->Wcounter] = *p->dlog_iptr1;
|
||||
#endif
|
||||
#if DLOG_DATA_SIZE == 32
|
||||
p->dl_buffer1_adr[p->Wcounter] = p->object1Info.varSize == 16 ?
|
||||
*((int16*)p->object1Info.varAddr) : *((int32*)p->object1Info.varAddr);
|
||||
#endif
|
||||
p->Wcounter++;
|
||||
if (p->Wcounter >= 1024) //если дошли до конца
|
||||
{
|
||||
p->mode_reset = 0; //режим СТОП
|
||||
|
||||
#if DLOG_DATA_SIZE == 16
|
||||
p->control |= 192; // "данные готовы" + "поддерживается блочная передача"
|
||||
#else
|
||||
p->control |= 192 | (1 << 8); // "данные готовы" + "поддерживается блочная передача" + "32-битные данные"
|
||||
#endif
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
252
Vsrc/V_event_log.c
Normal file
252
Vsrc/V_event_log.c
Normal file
@ -0,0 +1,252 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_event_log.c
|
||||
\brief Ñîõðàíåíèå ñîáûòèé è âðåìåíè âîçíèêíîâåíèß â ÝíÎÇÓ
|
||||
Èñïîëüçóåòñß äðàéâåð ðàáîòû ñ ýíåðãîíåçàâèñèìîé ïàìßòüþ
|
||||
Ïîýòîìó âûçîâ init(); äîëæåí áûòü ïîñëå èíèöèàëèçàöèè ÝíÎÇÓ
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.0 2009_01_20
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup W_event_log */
|
||||
/*@{*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <main.h>
|
||||
|
||||
|
||||
//!<Ïðîòîêîëèðîâàíèå àâàðèé
|
||||
|
||||
//Ïðîöåäóðû çàïèñè ñîáûòèé â ýíåðãîíåçàâèñèìóþ ôëåøêó î÷åíü äîëãèå (ñâÿçàíî ñ òàéìèíãàìè I2C-èíòåðôåéñà
|
||||
//è áîëüøèì îáúåìîì äàííûõ, ïåðåäàâàåìûì ïî I2C â ïðîöåññå çàïèñè).
|
||||
//Ïîýòîìó àëãîðèòì ðàáîòû òàêîé:
|
||||
//Åñëè íóæíî ïðî÷èòàòü àâàðèþ [Logger_Event_Read] (ñðî÷íî ñ÷èòûâàòü àâàðèþ èç áàíêà íå òðåáóåòñÿ) -
|
||||
//îíà ÷èòàåòñÿ â ôîíîâîì öèêëå ïðÿìèêîì èç ÝíÎÇÓ.
|
||||
//Åñëè íóæíî çàïèñàòü àâàðèþ â áàíê [Logger_Event_Write] - â ïðåðûâàíèè (íàïðèìåð, 1ìñ) äàííûå àâàðèè ïèøóòñÿ â FIFO;
|
||||
//çàòåì â ôîíîâîì öèêëå [Logger_Background_Calc] àâàðèè ÷èòàþòñÿ èç FIFO [Event_FIFO_Read]
|
||||
//(ïî îäíî çà 1 ôîíîâûé öèêë) è ïèøóòñÿ â ÝíÎÇÓ.
|
||||
|
||||
|
||||
//ïðî÷èòàòü ñîáûòèå èç FIFO (äëÿ äàëüíåéøåé çàïèñè â ÝíÎÇÓ).
|
||||
Uint16 Event_FIFO_Read(TEventFIFO* p,TEvent* ev)
|
||||
{
|
||||
if (p->busy_flag > 0) return EVENT_FIFO_BUSY;
|
||||
//âûñòàâëßåì ôëàæîê ðàáîòû ñ FIFO
|
||||
p->busy_flag = 1;
|
||||
if (p->number_of_msgs == 0)
|
||||
{
|
||||
//îñâîáîæäàåì ôëàã ðàáîòû ñ FIFO
|
||||
p->busy_flag = 0;
|
||||
return EVENT_FIFO_EMPTY;
|
||||
}
|
||||
//÷èòàåì äàííûå èç FIFO
|
||||
ev->ev_code = p->msg_array[(p->read_ptr)].ev_code;
|
||||
ev->ev_time = p->msg_array[(p->read_ptr)].ev_time;
|
||||
ev->ev_num = p->msg_array[(p->read_ptr)].ev_num;
|
||||
//ïîäãîòîâêà FIFO ê ñëåäóþùåìó âûçîâó
|
||||
p->read_ptr++;
|
||||
if (p->read_ptr >= p->size) p->read_ptr = 0;
|
||||
p->number_of_msgs--;
|
||||
//îñâîáîæäàåì ôëàã ðàáîòû ñ FIFO
|
||||
p->busy_flag = 0;
|
||||
return EVENT_FIFO_SUCCESSFUL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Çàïèñàòü ñîáûòèå â FIFO (âûçûâàåòñÿ â Logger_Event_Write, â ïðåðûâàíèè)
|
||||
Uint16 Event_FIFO_Write(TEventFIFO* p,TEvent* ev)
|
||||
{
|
||||
if (p->busy_flag > 0) return EVENT_FIFO_BUSY;
|
||||
//âûñòàâëßåì ôëàæîê ðàáîòû ñ FIFO
|
||||
p->busy_flag = 1;
|
||||
if (p->number_of_msgs == p->size)
|
||||
{
|
||||
//îñâîáîæäàåì ôëàã ðàáîòû ñ FIFO
|
||||
p->busy_flag = 0;
|
||||
return EVENT_FIFO_FULL;
|
||||
}
|
||||
//çàïèñûâàåì äàííûå â FIFO
|
||||
p->msg_array[(p->write_ptr)].ev_code = ev->ev_code;
|
||||
p->msg_array[(p->write_ptr)].ev_time = ev->ev_time;
|
||||
p->msg_array[(p->write_ptr)].ev_num = ev->ev_num;
|
||||
//ïîäãîòîâêà FIFO ê ñëåäóþùåìó âûçîâó
|
||||
p->write_ptr++;
|
||||
if (p->write_ptr >= p->size)p->write_ptr = 0;
|
||||
p->number_of_msgs++;
|
||||
//îñâîáîæäàåì ôëàã ðàáîòû ñ FIFO
|
||||
p->busy_flag = 0;
|
||||
return EVENT_FIFO_SUCCESSFUL;
|
||||
}
|
||||
|
||||
//èíèöèàëèçàöèÿ (åñëè áàíê çàáèò ìóñîðîì - âñå äàííûå FFFF, î÷èùàåì åãî)
|
||||
void Logger_Init(TLogger* p,Uint16 BS,Uint16 SA,Uint32* tptr)
|
||||
{
|
||||
TEvent tmp;
|
||||
Uint16 i;
|
||||
Uint16 last_log_num = 0;
|
||||
Uint16 last_log_index = 0;
|
||||
//èíèöèàëèçèðóåì âíóòðåííèå ïåðåìåííûå
|
||||
p->SPI_buf_size = BS;
|
||||
p->SPI_start_addr = SA;
|
||||
p->time_ptr = tptr;
|
||||
|
||||
//äàëåå íóæíî ïðîñêàíèðîâàòü áóôåð â ÝíÎÇÓ - íàéòè ïîñëåäíþþ
|
||||
UserMem.MemStartAddr = p->SPI_start_addr;
|
||||
UserMem.data_length = 0;
|
||||
for (i=0;i<p->SPI_buf_size;i++)
|
||||
{
|
||||
//÷èòàåì íîìåð
|
||||
UserMem.MemStartAddr += UserMem.data_length;
|
||||
UserMem.MCUStartAddr = (Uint16*)(&tmp.ev_num);
|
||||
UserMem.data_length = LOG_NUM_LENGTH;
|
||||
UserMem.read(&UserMem);
|
||||
//÷èòàåì âðåìß
|
||||
UserMem.MemStartAddr += UserMem.data_length;
|
||||
UserMem.MCUStartAddr = (Uint16*)(&tmp.ev_time);
|
||||
UserMem.data_length = LOG_TIME_LENGTH;
|
||||
UserMem.read(&UserMem);
|
||||
//÷èòàåì êîä
|
||||
UserMem.MemStartAddr += UserMem.data_length;
|
||||
UserMem.MCUStartAddr = (Uint16*)(&tmp.ev_code);
|
||||
UserMem.data_length = LOG_CODE_LENGTH;
|
||||
UserMem.read(&UserMem);
|
||||
|
||||
//äåëàåì íåîáõîäèìûå ïðîâåðêè
|
||||
//åñëè âñå ïîëß 0xFFFF, òî ÷èñòèì âñþ ïàìßòü
|
||||
if ((tmp.ev_num == 0xFFFF) && (tmp.ev_time == 0xFFFFFFFF) && (tmp.ev_code == 0xFFFF))
|
||||
{
|
||||
//÷èñòèì
|
||||
p->clear(p);
|
||||
//èíèöèàëèçèðóåì ïåðåìåííûå
|
||||
p->INTERNAL_last_log_num = 0;
|
||||
p->INTERNAL_last_log_index = 0;
|
||||
return;
|
||||
}
|
||||
//èùåì ïîñëåäíþþ çàïèñü
|
||||
if (last_log_num < tmp.ev_num)
|
||||
{
|
||||
last_log_num = tmp.ev_num;
|
||||
last_log_index = i;
|
||||
}
|
||||
}
|
||||
p->INTERNAL_last_log_num = last_log_num;
|
||||
p->INTERNAL_last_log_index = last_log_index;
|
||||
}
|
||||
|
||||
//ôóíêöèß î÷èñòêè áóôåðà â ÝíÎÇÓ
|
||||
void Logger_Clear(TLogger* p)
|
||||
{
|
||||
Uint16 zero = 0;
|
||||
UserMem.MemStartAddr = p->SPI_start_addr;
|
||||
UserMem.MCUStartAddr = (Uint16*)(&zero);
|
||||
UserMem.data_length = 1;
|
||||
for (int i=0;i<(p->SPI_buf_size * (LOG_LENGTH));i++)
|
||||
{
|
||||
UserMem.write(&UserMem);
|
||||
UserMem.MemStartAddr++;
|
||||
}
|
||||
p->INTERNAL_last_log_index = 0;
|
||||
p->INTERNAL_last_log_num = 0;
|
||||
}
|
||||
|
||||
|
||||
//áûñòðàß ôóíêöèß çàïèñè ñîáûòèß â FIFO
|
||||
Uint16 Logger_Event_Write(TLogger* p,Uint16 code)
|
||||
{
|
||||
TEvent event;
|
||||
//ôîðìèðóåì äàííûå
|
||||
__disable_irq();
|
||||
event.ev_time = *(p->time_ptr);
|
||||
event.ev_code = code;
|
||||
event.ev_num = ++p->INTERNAL_last_log_num;
|
||||
p->INTERNAL_last_log_code = code;
|
||||
__enable_irq();
|
||||
//ïèøåì â FIFO
|
||||
return p->FIFO.write((struct SEventFIFO*)&(p->FIFO),(TEvent*)&event);
|
||||
}
|
||||
|
||||
//ïðî÷èòàòü àâàðèþ èç áàíêà, ñëîæèòü äàííûå â TEvent* event
|
||||
void Logger_Event_Read(TLogger* p,Uint16 shift_index,TEvent* event)
|
||||
{
|
||||
Uint16 correction = 0;
|
||||
//ïðîâåðßåì ïðàâèëüíîñòü çàïðîñà
|
||||
if (shift_index > (p->SPI_buf_size - 1)) return;
|
||||
|
||||
//ââîä êîððåêöèè äëß îðãàíèçàöèè êîëüöà
|
||||
if (((int16)p->INTERNAL_last_log_index - (int16)shift_index) < 0) correction = p->SPI_buf_size;
|
||||
//÷òåíèå íîìåðà
|
||||
UserMem.MemStartAddr = p->SPI_start_addr + ((p->INTERNAL_last_log_index - shift_index + correction)*(LOG_LENGTH));
|
||||
UserMem.MCUStartAddr = (Uint16*)(&(event->ev_num));
|
||||
UserMem.data_length = LOG_NUM_LENGTH;
|
||||
UserMem.read(&UserMem);
|
||||
//÷òåíèå âðåìåíè
|
||||
UserMem.MemStartAddr += UserMem.data_length;
|
||||
UserMem.MCUStartAddr = (Uint16*)(&(event->ev_time));
|
||||
UserMem.data_length = LOG_TIME_LENGTH;
|
||||
UserMem.read(&UserMem);
|
||||
//÷òåíèå êîäà
|
||||
UserMem.MemStartAddr += UserMem.data_length;
|
||||
UserMem.MCUStartAddr = (Uint16*)(&(event->ev_code));
|
||||
UserMem.data_length = LOG_CODE_LENGTH;
|
||||
UserMem.read(&UserMem);
|
||||
}
|
||||
|
||||
//ôóíêöèß îáðàáîòêè FIFO è çàïèñè àâàðèé â ÝíÎÇÓ. Åñëè â FIFO ÷òî-òî êëàëè - çàïèøåì âî ôëåøêó.
|
||||
//Åñëè FIFO çàíÿòà èëè ïóñòàÿ - îòäûõàåì.
|
||||
void Logger_Background_Calc(TLogger* p)
|
||||
{
|
||||
Uint16 ret;
|
||||
TEvent event;
|
||||
//÷òîáû íå ñèëüíî çàòîðìàæèâàòü ôîíîâûé öèêë áóäåì çàïèñûâàòü ïî 1 çàïèñè çà ðàç
|
||||
ret = p->FIFO.read((struct SEventFIFO*)&(p->FIFO),(TEvent*)&event);
|
||||
if (ret == EVENT_FIFO_SUCCESSFUL)
|
||||
{
|
||||
//ïèøåì â ÝíÎÇÓ
|
||||
if (p->INTERNAL_last_log_index >= (p->SPI_buf_size - 1)) p->INTERNAL_last_log_index = 0;
|
||||
else p->INTERNAL_last_log_index++;
|
||||
|
||||
//çàïèñü íîìåðà
|
||||
UserMem.MemStartAddr = p->SPI_start_addr + (p->INTERNAL_last_log_index)*(LOG_LENGTH);
|
||||
UserMem.MCUStartAddr = (Uint16*)(&(event.ev_num));
|
||||
UserMem.data_length = LOG_NUM_LENGTH;
|
||||
UserMem.write(&UserMem);
|
||||
//çàïèñü âðåìåíè
|
||||
UserMem.MemStartAddr += UserMem.data_length;
|
||||
UserMem.MCUStartAddr = (Uint16*)(&(event.ev_time));
|
||||
UserMem.data_length = LOG_TIME_LENGTH;
|
||||
UserMem.write(&UserMem);
|
||||
//çàïèñü êîäà
|
||||
UserMem.MemStartAddr += UserMem.data_length;
|
||||
UserMem.MCUStartAddr = (Uint16*)(&(event.ev_code));
|
||||
UserMem.data_length = LOG_CODE_LENGTH;
|
||||
UserMem.write(&UserMem);
|
||||
}
|
||||
}
|
||||
|
||||
//ôóíêöèÿ ïðîâåðêè è çàïèñè âèñÿùèõ â äàííûé ìîìåíò ôëàãîâ àâàðèé
|
||||
//Ïîñëåäîâàòåëüíî ñìîòðèòñÿ êàæäûé áèò ñëîâ àâàðèé è, åñëè îí âçâåäåí, íî åùå íå çàïèñàí, ïðîèçâîäèòñÿ çàïèñü.
|
||||
void Logger_ms_Calc(TLogger* p){
|
||||
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // Extern "C"
|
||||
#endif
|
||||
/*@}*/
|
53
Vsrc/V_hzprof.c
Normal file
53
Vsrc/V_hzprof.c
Normal file
@ -0,0 +1,53 @@
|
||||
/*!
|
||||
Copyright 2017 Texas Instruments, ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_hzprof.c
|
||||
\brief Êðèâàÿ U(f) (ñì. TVhzProf)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup vhzprof
|
||||
*/
|
||||
|
||||
#include "V_IQmath.h" /* Include header for IQmath library */
|
||||
#include "V_hzprof.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
//! Ôóíêöèÿ ðàñ÷åòà êðèâîé U(f)
|
||||
|
||||
//!Íà âõîä ïðèíèìàåò ÷àñòîòó freq, è èñõîäÿ èç íàñòðîåííûõ çíà÷åíèé
|
||||
//!ìèíèìàëüíîãî íàïðÿæåíèÿ íà ìèíèìàëüíîé ÷àñòîòå è ìàêñèìàëüíîãî
|
||||
//!íàïðÿæåíèÿ íà ìàêñèìàëüíîé ÷àñòîòå, âûäàåò vout - íàïðÿæåíèå
|
||||
//!äëÿ ÷àñòîòû freq. Äðóãèìè ñëîâàìè, ìîäóëü ïðåäñòàâëÿåò ñîáîé
|
||||
//!ëèíåéíûé èíòåðïîëÿòîð ïî äâóì ðåïåðíûì òî÷êàì ñ îãðàíè÷åíèåì ìàêñèìóìà è
|
||||
//!ìèíèìóìà.
|
||||
|
||||
//! \memberof TVhzProf
|
||||
void vhz_prof_calc(TVhzProf *v) {
|
||||
_iq vf_slope, freq_abs;
|
||||
|
||||
freq_abs = labs(v->freq);
|
||||
|
||||
if (freq_abs <= v->FL)
|
||||
v->vout = v->Vmin; /* Profile #1 */
|
||||
else if ((freq_abs > v->FL) & (freq_abs <= v->FH)) {
|
||||
vf_slope = _IQdiv((v->Vmax - v->Vmin), (v->FH - v->FL)); /* Computing v/f slope */
|
||||
v->vout = v->Vmin + _IQmpy(vf_slope, (freq_abs - v->FL)); /* Profile #2 */
|
||||
} else if ((freq_abs > v->FH) & (freq_abs < v->Fmax))
|
||||
v->vout = v->Vmax; /* Profile #3 */
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
78
Vsrc/V_led.c
Normal file
78
Vsrc/V_led.c
Normal file
@ -0,0 +1,78 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file Vled.c
|
||||
\brief Óïðàâëåíèå ñâåòîäèîäàìè
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup led
|
||||
*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "main.h"
|
||||
|
||||
|
||||
void LED_init(Tled *p) {
|
||||
|
||||
}
|
||||
|
||||
void LED_toggle(Tled *p, Uint16 led) {
|
||||
|
||||
}
|
||||
|
||||
void LED_on(Tled *p, Uint16 led) {
|
||||
|
||||
}
|
||||
|
||||
void LED_off(Tled *p, Uint16 led) {
|
||||
|
||||
}
|
||||
|
||||
void LED_clearAll(Tled *p) {
|
||||
|
||||
}
|
||||
|
||||
void LED_mode0(Tled *p) {
|
||||
|
||||
}
|
||||
|
||||
void LED_mode1(Tled *p) {
|
||||
|
||||
}
|
||||
|
||||
void LED_mode2(Tled *p) {
|
||||
|
||||
}
|
||||
|
||||
void LED_mode3(Tled *p) {
|
||||
|
||||
}
|
||||
|
||||
void LED_msCalc(Tled *p) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
111
Vsrc/V_pid_reg3.c
Normal file
111
Vsrc/V_pid_reg3.c
Normal file
@ -0,0 +1,111 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_pid_reg3.c
|
||||
\brief ÏÈÄ-ðåãóëÿòîð (ñì. TPidReg3)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup V_pid_reg3
|
||||
@{*/
|
||||
|
||||
#include "V_IQmath.h" // Include header for IQmath library
|
||||
#include "V_pid_reg3.h"
|
||||
#include "stdlib.h"
|
||||
#include "main.h"
|
||||
//! Ôóíêöèÿ ðàñ÷åòà ÏÈÄ ðåãóëÿòîðà
|
||||
//! Âîîáùå ýòî ÷óòü äîðàáîòàííàÿ âåðñèÿ òåêñàñîâñêîãî ðåãóëÿòîðà
|
||||
//! Äîêóìåíòàöèþ ýòîé ìàãèè ëó÷øå âñåãî ïîñìîòðåòü, çàãóãëèâ pid_reg3.pdf
|
||||
|
||||
//! Íà âõîäå pid_ref_reg3 - çàäàíèå, pid_fdb_reg3 - îáðàòíàÿ ñâÿçü
|
||||
//! Íà âûõîäå pid_out_reg3.
|
||||
|
||||
//! \memberof TPidReg3
|
||||
void pid_reg3_calc(TPidReg3 *v) {
|
||||
v->e_reg3 = v->pid_ref_reg3 - v->pid_fdb_reg3;//îøèáêà - çàäàíèå ìèíóñ îáðàòíàÿ ñâÿçü
|
||||
v->e_reg3Dz=v->e_reg3;//îøèáêà ïîñëå êîððåêöèè áëîêà ìåðòâîé çîíû
|
||||
|
||||
if (v->DeadZone!=0){//åñëè åñòü óñòàâêà çîíû íå÷óâñòâèòåëüíîñòè
|
||||
if (v->e_reg3Dz>0){//îøèáêà â ïëþñ
|
||||
v->e_reg3Dz=v->e_reg3Dz-v->DeadZone;//âû÷èòàåì ìåðòâóþ çîíó
|
||||
if (v->e_reg3Dz<0)//íî òàê, ÷òîáû îøèáêà íå ñòàëà îòðèöàòåëüíîé
|
||||
v->e_reg3Dz=0;
|
||||
}
|
||||
if (v->e_reg3Dz<0){
|
||||
v->e_reg3Dz=v->e_reg3Dz+v->DeadZone;
|
||||
if (v->e_reg3Dz>0)
|
||||
v->e_reg3Dz=0;
|
||||
}
|
||||
}
|
||||
|
||||
v->up_reg3 = _IQmpy(v->Kp_reg3, v->e_reg3Dz);
|
||||
|
||||
v->uprsat_reg3 = v->up_reg3 + v->ui_reg3 + v->ud_reg3;
|
||||
|
||||
if (v->uprsat_reg3 > v->pid_out_max)
|
||||
v->pid_out_reg3 = v->pid_out_max;
|
||||
else if (v->uprsat_reg3 < v->pid_out_min)
|
||||
v->pid_out_reg3 = v->pid_out_min;
|
||||
else
|
||||
v->pid_out_reg3 = v->uprsat_reg3;
|
||||
|
||||
v->saterr_reg3 = v->pid_out_reg3 - v->uprsat_reg3 + v->saterr_reg3Add;
|
||||
|
||||
//èñïîëüçîâàòü ëè ôèëüòð äëÿ äèôô. ÷àñòè. Åñëè êôèëüòðà íîëü, òî íåò.
|
||||
if (v->Kf_d == 0){
|
||||
v->e_reg3_filterOut = v->e_reg3;//âûõîä ôèëüòðà
|
||||
}
|
||||
else{//èíà÷å ñ÷èòàåì ôèëüòð
|
||||
v->e_reg3_filterOut = v->e_reg3_filterOut
|
||||
+ _IQmpy(v->Kf_d, (v->e_reg3 - v->e_reg3_filterOut));
|
||||
}
|
||||
|
||||
if ((v->DiffCounter++ + 1) >= v->DiffDelim) {//êàæäûå ñêîëüêî âûçîâîâ ñ÷èòàòü äèôô. ÷àñòü
|
||||
if (v->KdFilterInitFlag==1){//ýòî ïåðâûé òàêò ðàñ÷åòà ðåãóëÿòîðà
|
||||
v->e_reg3_filterOut = v->e_reg3;//âûõîä ôèëüòðà îøèáêè èíèöèàëèçèðóåì îøèáêîé
|
||||
v->up1_reg3 = v->e_reg3_filterOut;//ïðîèçâîäíàÿ íîëü
|
||||
v->KdFilterInitFlag=0;//èíèöèàëèçàöèÿ çàâåðøåíà
|
||||
}
|
||||
v->ud_reg3 = _IQmpy(v->Kd_reg3, (v->e_reg3_filterOut - v->up1_reg3)<<6);//äèôôåðåíöèàëüíàÿ ÷àñòü
|
||||
v->up1_reg3 = v->e_reg3_filterOut;
|
||||
v->DiffCounter = 0;
|
||||
}
|
||||
|
||||
if (v->Ki_reg3 != 0)//åñòü èíòåãðàëüíàÿ ñîñòàâëÿþùàÿ
|
||||
v->ui_reg3 = v->ui_reg3
|
||||
+ _IQmpy(v->Ki_reg3,
|
||||
v->up_reg3) + _IQmpy(v->Kc_reg3,v->saterr_reg3);
|
||||
else
|
||||
v->ui_reg3 = 0;
|
||||
|
||||
if (v->Kc_reg3 == 0) {
|
||||
if (v->ui_reg3 > v->pid_out_max)
|
||||
v->ui_reg3 = v->pid_out_max;
|
||||
else if (v->ui_reg3 < v->pid_out_min)
|
||||
v->ui_reg3 = v->pid_out_min;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//! \memberof TPidReg3
|
||||
void pid_reg3_reset(TPidReg3 *v) {
|
||||
v->pid_fdb_reg3=0;
|
||||
v->pid_ref_reg3=0;
|
||||
v->ui_reg3=0;
|
||||
v->KdFilterInitFlag=1;
|
||||
}
|
||||
|
||||
/*@}*/
|
109
Vsrc/V_pid_reg3_pos.c
Normal file
109
Vsrc/V_pid_reg3_pos.c
Normal file
@ -0,0 +1,109 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_pid_reg3.c
|
||||
\brief ÏÈÄ-ðåãóëÿòîð (ñì. TPidReg3)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup V_pid_reg3
|
||||
@{*/
|
||||
|
||||
#include "V_IQmath.h" // Include header for IQmath library
|
||||
#include "V_pid_reg3_pos.h"
|
||||
#include "stdlib.h"
|
||||
#include "main.h"
|
||||
//! Ôóíêöèÿ ðàñ÷åòà ÏÈÄ ðåãóëÿòîðà
|
||||
//! Âîîáùå ýòî ÷óòü äîðàáîòàííàÿ âåðñèÿ òåêñàñîâñêîãî ðåãóëÿòîðà
|
||||
//! Äîêóìåíòàöèþ ýòîé ìàãèè ëó÷øå âñåãî ïîñìîòðåòü, çàãóãëèâ pid_reg3.pdf
|
||||
|
||||
//! Íà âõîäå pid_ref_reg3 - çàäàíèå, pid_fdb_reg3 - îáðàòíàÿ ñâÿçü
|
||||
//! Íà âûõîäå pid_out_reg3.
|
||||
|
||||
//! \memberof TPidReg3
|
||||
void pid_reg3_calc_pos(TPidReg3_pos *v) {
|
||||
v->e_reg3 = v->pid_ref_reg3 - v->pid_fdb_reg3;//îøèáêà - çàäàíèå ìèíóñ îáðàòíàÿ ñâÿçü
|
||||
v->e_reg3Dz=v->e_reg3;//îøèáêà ïîñëå êîððåêöèè áëîêà ìåðòâîé çîíû
|
||||
|
||||
if (v->DeadZone!=0){//åñëè åñòü óñòàâêà çîíû íå÷óâñòâèòåëüíîñòè
|
||||
if (v->e_reg3Dz>0){//îøèáêà â ïëþñ
|
||||
v->e_reg3Dz=v->e_reg3Dz-v->DeadZone;//âû÷èòàåì ìåðòâóþ çîíó
|
||||
if (v->e_reg3Dz<0)//íî òàê, ÷òîáû îøèáêà íå ñòàëà îòðèöàòåëüíîé
|
||||
v->e_reg3Dz=0;
|
||||
}
|
||||
if (v->e_reg3Dz<0){
|
||||
v->e_reg3Dz=v->e_reg3Dz+v->DeadZone;
|
||||
if (v->e_reg3Dz>0)
|
||||
v->e_reg3Dz=0;
|
||||
}
|
||||
}
|
||||
|
||||
v->up_reg3 = _IQmpy(v->Kp_reg3, v->e_reg3Dz);
|
||||
|
||||
v->uprsat_reg3 = v->up_reg3 + v->ui_reg3 + v->ud_reg3;
|
||||
|
||||
if (v->uprsat_reg3 > v->pid_out_max)
|
||||
v->pid_out_reg3 = v->pid_out_max;
|
||||
else if (v->uprsat_reg3 < v->pid_out_min)
|
||||
v->pid_out_reg3 = v->pid_out_min;
|
||||
else
|
||||
v->pid_out_reg3 = v->uprsat_reg3;
|
||||
|
||||
v->saterr_reg3 = v->pid_out_reg3 - v->uprsat_reg3 + v->saterr_reg3Add;
|
||||
|
||||
//èñïîëüçîâàòü ëè ôèëüòð äëÿ äèôô. ÷àñòè. Åñëè êôèëüòðà íîëü, òî íåò.
|
||||
if (v->Kf_d == 0){
|
||||
v->e_reg3_filterOut = v->e_reg3;//âûõîä ôèëüòðà
|
||||
}
|
||||
else{//èíà÷å ñ÷èòàåì ôèëüòð
|
||||
v->e_reg3_filterOut = posspeedEqep.speed_elec;
|
||||
}
|
||||
|
||||
if ((v->DiffCounter++ + 1) >= v->DiffDelim) {//êàæäûå ñêîëüêî âûçîâîâ ñ÷èòàòü äèôô. ÷àñòü
|
||||
if (v->KdFilterInitFlag==1){//ýòî ïåðâûé òàêò ðàñ÷åòà ðåãóëÿòîðà
|
||||
v->e_reg3_filterOut = posspeedEqep.speed_elec;//âûõîä ôèëüòðà îøèáêè èíèöèàëèçèðóåì îøèáêîé
|
||||
v->KdFilterInitFlag=0;//èíèöèàëèçàöèÿ çàâåðøåíà
|
||||
}
|
||||
//v->ud_reg3 = _IQmpy(v->Kd_reg3, (v->e_reg3_filterOut - v->up1_reg3)<<6);//äèôôåðåíöèàëüíàÿ ÷àñòü
|
||||
v->ud_reg3 = _IQmpy(v->Kd_reg3,-posspeedEqep.speed_filter.output);
|
||||
v->DiffCounter = 0;
|
||||
}
|
||||
|
||||
if (v->Ki_reg3 != 0)//åñòü èíòåãðàëüíàÿ ñîñòàâëÿþùàÿ
|
||||
v->ui_reg3 = v->ui_reg3
|
||||
+ _IQmpy(v->Ki_reg3,
|
||||
v->up_reg3) + _IQmpy(v->Kc_reg3,v->saterr_reg3);
|
||||
else
|
||||
v->ui_reg3 = 0;
|
||||
|
||||
if (v->Kc_reg3 == 0) {
|
||||
if (v->ui_reg3 > v->pid_out_max)
|
||||
v->ui_reg3 = v->pid_out_max;
|
||||
else if (v->ui_reg3 < v->pid_out_min)
|
||||
v->ui_reg3 = v->pid_out_min;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//! \memberof TPidReg3
|
||||
void pid_reg3_reset_pos(TPidReg3_pos *v) {
|
||||
v->pid_fdb_reg3=0;
|
||||
v->pid_ref_reg3=0;
|
||||
v->ui_reg3=0;
|
||||
v->KdFilterInitFlag=1;
|
||||
}
|
||||
|
||||
/*@}*/
|
66
Vsrc/V_rmp_ctrl.c
Normal file
66
Vsrc/V_rmp_ctrl.c
Normal file
@ -0,0 +1,66 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file v_rmp_ctrl.c
|
||||
\brief Çàäàò÷èê èíòåíñèâíîñòè (ñì. TRMPCtrl)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup V_rmp_ctrl */
|
||||
/*@{*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "v_rmp_ctrl.h"
|
||||
#include "V_IQmath.h"
|
||||
#include "stdlib.h"
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
//! Ôóíêöèÿ ðàñ÷åòà çàäàò÷èêà èíòåíñèâíîñòè
|
||||
|
||||
//!Èçìåíÿåò output ñ çàäàííûì òåìïîì T,
|
||||
//!ïîêà output íå äîñòèãíåò input.
|
||||
|
||||
//! \memberof TRMPCtrl
|
||||
void V_RMP_CTRL_calc(TRMPCtrl *p) {
|
||||
//âûõîä ìåíüøå âõîäà?
|
||||
if (p->output < p->input)
|
||||
p->output += p->step;//óâåë÷è÷èâàåì ñ çàäàííûì òåìïîì âûõîä
|
||||
if (p->output > p->input)
|
||||
p->output -= p->step;
|
||||
|
||||
if ((labs(p->output - p->input) <= p->step) || (p->T==0)) {//âîøëè â çàäàíèå ñ òî÷íîñòü äî øàãà èëè ÇÈ âîîáùå îòêëþ÷åí
|
||||
p->output = p->input;//âûõîä ðàâåí âõîäó
|
||||
}
|
||||
}
|
||||
|
||||
//! Âñïîìîãàòåëüíàÿ ôóíêöèÿ çàäàò÷èêà èíòåíñèâíîñòè
|
||||
|
||||
//!Ïåðåñ÷èòûâàåò òåìï ðàçãîíà T â øàã step c ó÷åòîì ÷àñòîòû
|
||||
//!âûçîâà îñíîâíîé ôóíêöèè Ts (äèñêðåòèçàöèÿ, îáû÷íî 10êÃö).
|
||||
|
||||
//! \memberof TRMPCtrl
|
||||
void V_RMP_CTRL_slow_calc(TRMPCtrl *p) {
|
||||
p->step = _IQdiv(p->Ts, p->T);//øàã èíòåãðàòîðà ÇÈ
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
47
Vsrc/V_rotor_observer.c
Normal file
47
Vsrc/V_rotor_observer.c
Normal file
@ -0,0 +1,47 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file v_rotor_observer.c
|
||||
\brief Íàáëþäàòåëü ðîòîðà ÀÄ (ñì. TRotorObserver)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 1.0 28/06/2016
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup TRotorObserver */
|
||||
/*@{*/
|
||||
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma CODE_SECTION("secureRamFuncs")
|
||||
#else
|
||||
#pragma CODE_SECTION(RotorObserver_calc,"secureRamFuncs");
|
||||
#endif
|
||||
|
||||
void RotorObserver_calc(TRotorObserver *p) {
|
||||
//èíåðöèîííîå çâåíî ñ ïàðàìåòðàìè ðîòîðà
|
||||
p->psi_d = p->psi_d + _IQmpy(p->Ks,p->id - p->psi_d);
|
||||
p->psi_q = p->psi_q + _IQmpy(p->Ks,p->iq - p->psi_q);
|
||||
p->theta_psi_elec = _IQatan2PU(p->psi_q ,p->psi_d);
|
||||
}
|
||||
|
||||
void RotorObserver_slow_calc(TRotorObserver *p) {
|
||||
p->Ks=_IQdiv(FAST_CALC_TS,p->Tr);
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
69
Vsrc/V_watchdog.c
Normal file
69
Vsrc/V_watchdog.c
Normal file
@ -0,0 +1,69 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file V_PWM_Module.c
|
||||
\brief Ìîäóëü ðåàëèçàöèè âåêòîðíîé ØÈÌ (ñì. TPWM_Module)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup Twdog
|
||||
@{*/
|
||||
#include "main.h"
|
||||
|
||||
Twdog Watchdog = WDOG_DEFAULTS;
|
||||
// Ðàçðåøåíèå âî÷äîãà
|
||||
void WDog_Enable (){
|
||||
RCU->WDTCFG_bit.CLKSEL = 2; // PLL
|
||||
RCU->WDTCFG_bit.DIVN = 1; // PLL / 4
|
||||
RCU->WDTCFG_bit.DIVEN = 1;
|
||||
RCU->WDTCFG_bit.RSTDIS = 1;
|
||||
RCU->WDTCFG_bit.CLKEN = 1;
|
||||
|
||||
WDT->LOCK = 0x1ACCE551;
|
||||
WDT->LOAD_bit.VAL = 100000;
|
||||
WDT->CTRL_bit.INTEN = 1;
|
||||
WDT->CTRL_bit.RESEN = 1;
|
||||
WDT->LOCK = 0x1ACCE551;
|
||||
|
||||
}
|
||||
|
||||
// Îòêëþ÷åíèå âî÷äîãà
|
||||
void WDog_Disable (){
|
||||
WDT->LOCK = 0x1ACCE551;
|
||||
WDT->CTRL_bit.INTEN = 0;
|
||||
WDT->CTRL_bit.RESEN = 0;
|
||||
WDT->LOCK = 0x1ACCE551;
|
||||
}
|
||||
|
||||
// Ñáðîñ òàéìåðà âî÷äîãà
|
||||
void WDog_Feed (){
|
||||
WDT->LOCK = 0x1ACCE551;
|
||||
WDT->LOAD_bit.VAL = 2500 * 3; // 3 * 10 êÃö ïðåðûâàíèÿ
|
||||
WDT->LOCK = 0x1ACCE551;
|
||||
}
|
||||
|
||||
// Ïåðåçàãðóçêà ïðîöà âî÷äîãîì
|
||||
void WDog_ResetSystem (){
|
||||
DINT;
|
||||
WDog_Enable();
|
||||
WDT->LOCK = 0x1ACCE551;
|
||||
WDT->LOAD_bit.VAL = 2; // 2 òàêòà
|
||||
WDT->LOCK = 0x1ACCE551;
|
||||
|
||||
while(1);
|
||||
}
|
||||
|
||||
|
||||
/*@}*/
|
35
Vsrc/clarke.c
Normal file
35
Vsrc/clarke.c
Normal file
@ -0,0 +1,35 @@
|
||||
/*!
|
||||
Copyright 2017 Texas Instruments, ÀÎ "ÍÈÈÝÒ" , ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file clarke.c
|
||||
\brief Ìîäóëü ôàçíûõ ïðåîáðàçîâàíèé (ñì. TClarke)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
\addtogroup clarke
|
||||
@{
|
||||
*/
|
||||
|
||||
#include "V_IQmath.h" /* Include header for IQmath library */
|
||||
#include "clarke.h"
|
||||
|
||||
//! Ôóíêöèÿ ôàçíûõ ïðåîáðàçîâàíèé
|
||||
//! \memberof TClarke
|
||||
void clarke_calc(TClarke *v) {
|
||||
v->ds = v->as;
|
||||
v->qs = _IQmpy((v->as + _IQmpy(_IQ(2),v->bs)), _IQ(0.57735026918963));
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
3939
Vsrc/cood1.c
Normal file
3939
Vsrc/cood1.c
Normal file
File diff suppressed because it is too large
Load Diff
43
Vsrc/filter.c
Normal file
43
Vsrc/filter.c
Normal file
@ -0,0 +1,43 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file filter.c
|
||||
\brief Èíåðöèîííîå çâåíî â IQ ìàòåìàòèêå (ñì. TFilter)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup filter */
|
||||
/*@{*/
|
||||
|
||||
#include "DSP.h"
|
||||
#include "filter.h"
|
||||
#include "V_IQmath.h"
|
||||
|
||||
//! Èíåðöèîííîå çâåíî 1/(Tp+1)
|
||||
//! Èñïîëüçóåòñÿ êàê ôèëüòð ïåðâîãî ïîðÿäêà
|
||||
|
||||
//!Äîëæíà âûçûâàòüñÿ ñ çàäàííîé äèñêðåòèçàöèåé. Ïðåäâàðèòåëüíî íåîáõîäèìî îïðåäåëèòü
|
||||
//! ïåðåìåííóþ, ñâÿçàííóþ ñ ïîñòîÿííîé âðåìåíè:
|
||||
//! T=Ts/Tfiltra ãäå - Tfiltra ïîñòîÿííàÿ âðåìåíè ôèëüòðà, à
|
||||
//! Ts - âðåìÿ äèñêðåòèçàöèè âûçîâà ôóíöèè
|
||||
//! \memberof TFilter
|
||||
void TFilter_Calc(TFilter *p) {
|
||||
p->output = _IQmpy(p->T,(p->input-p->output)) + p->output;
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
45
Vsrc/ipark.c
Normal file
45
Vsrc/ipark.c
Normal file
@ -0,0 +1,45 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file ipark.c
|
||||
\brief Ìîäóëü èíâåðñíûõ êîîðäèíàòíûõ ïðåîáðàçîâàíèé êîîðäèíàò (ñì. TIPark)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup IPark
|
||||
@{
|
||||
*/
|
||||
|
||||
#include "V_IQmath.h" /* Include header for IQmath library */
|
||||
#include "ipark.h"
|
||||
|
||||
//! Ôóíêöèÿ èíâåðñíûõ ïðåîáðàçîâàíèé êîîðäèíàò
|
||||
|
||||
//!Íà âõîäå óãîë ang, âåêòîð (de,qe).
|
||||
//!Íà âûõîäå ïîâåðíóòûé íà çàäàííûé óãîë âåêòîð (ds,qs)
|
||||
//! \memberof TIPark
|
||||
void ipark_calc(TIPark *v) {
|
||||
|
||||
_iq cos_ang, sin_ang;
|
||||
|
||||
sin_ang = _IQsinPU(v->ang);
|
||||
cos_ang = _IQcosPU(v->ang);
|
||||
|
||||
v->ds = _IQmpy(v->de,cos_ang) - _IQmpy(v->qe, sin_ang);
|
||||
v->qs = _IQmpy(v->qe,cos_ang) + _IQmpy(v->de, sin_ang);
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
322
Vsrc/main.c
Normal file
322
Vsrc/main.c
Normal file
@ -0,0 +1,322 @@
|
||||
/*!
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file main.c
|
||||
\brief Главный файл проекта. Содержит main(), а также обработчики прерываний.
|
||||
\author ООО "НПФ Вектор". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
*/
|
||||
|
||||
/** \addtogroup MAIN */
|
||||
/*@{*/
|
||||
#include "main.h"
|
||||
#include <string.h> //для memcpy
|
||||
|
||||
|
||||
TClarke clarke = CLARKE_DEFAULTS; //!<Фазные преобразования
|
||||
TPark park = PARK_DEFAULTS; //!<Координатные преобразования
|
||||
TIPark ipark = IPARK_DEFAULTS; //!<Обратные координатные преобразования
|
||||
TPidReg3 pid_id = PIDREG3_DEFAULTS; //!<Рег. тока по оси d
|
||||
TPidReg3 pid_iq = PIDREG3_DEFAULTS; //!<Рег. тока по оси q
|
||||
TPidReg3 pid_ia = PIDREG3_DEFAULTS; //!<Рег. тока якоря ДПТ
|
||||
TPidReg3 pid_spd = PIDREG3_DEFAULTS; //!<Рег. скорости
|
||||
TPidReg3_pos pid_pos = PIDREG3_DEFAULTS_POS; //!<Рег. положения
|
||||
TVhzProf vhz = VHZPROF_DEFAULTS; //!< закон U/f=const
|
||||
TSM_Sys sm_sys = SM_Sys_DEFAULTS; //!< Главная оболочка для вызова всех модулей
|
||||
Uint16 disp_group_number = 0; //!< Необходимо для драйвера CANOpen и Unicon
|
||||
TDataLog dlog = DATALOG_DEFAULTS; //!< Модуль осциллографирования переменных CANOpen
|
||||
TSM_Protect sm_prot = SM_PROTECT_DEFAULTS; //!< Модуль защит
|
||||
TBitsToEnumNums pult_faults_lister = BITS_TO_ENUM_NUMS_DEFAULTS; //!<Листалка аварий для Unicon
|
||||
TSM_Ctrl sm_ctrl = SM_CTRL_DEFAULTS; //!< Главный дискретный автомат, реализует структуру управления
|
||||
TSM_CmdLogic sm_cmd_logic = SM_CMD_LOGIC_DEFAULTS; //!< Обработка пользовательских команд управления
|
||||
TSM_Net sm_net = SM_NET_DEFAULTS; //!< Оболочка для вызова сетевых драйверов
|
||||
TRMPCtrl rmp = V_RMP_CTRL_DEFAULTS; //!< Задатчик интенсивности
|
||||
TAdcDrv adc = ADC_DRV_DEFAULTS; //!< Модуль АЦП
|
||||
TPWM_Module pwm = PWM_Module_DEFAULTS; //!< Модуль ШИМ
|
||||
TDPReCAP DPReCAP = DPRECAP_DEFAULTS; //!< Модуль ДПР на элементах Холла
|
||||
TposspeedEqep posspeedEqep = POSSPEED_DEFAULTS; //!< Модуль ДПР типа энкодер
|
||||
TCurPar cur_par = TCUR_PAR_DEFAULTS; //!< Модуль расчета и хранения текущих показателей привода - мощность, скорость
|
||||
TUserMemory UserMem = USERMEMORY_DEFAULTS; //!< Модуль работы с энергонезависимой памятью.
|
||||
Tled leds = LED_DEFAULTS; //!< модуль для красивого мигания светодиодами
|
||||
//TCanBTInterface Can2BTInterface = T_CANBT_INTERFACE_DEFAULTS;//!<Пакетная передача CANopen
|
||||
TRTCClock RTCclock = RTC_CLOCK_DEFAULTS; //!< Модуль работы с часами реальноговремени. "spi" - по историческим причинам совместимости
|
||||
TAutoOffset AutoOffset = AUTO_OFFSET_DEFAULTS; //!<Автоматическая подстройка смещения токов АЦП
|
||||
TSSI_Encoder SSI_Encoder = SSI_ENCODER_DEFAULTS; //!<Драйвер обработки датчика положения с SSI интерфейсом
|
||||
//TMotorModel model = MOTOR_MODEL_DEFAULTS; //!< Модели электродвигателей для отладки "на столе" в режиме симулятора
|
||||
TRotorObserver RotorObserver = ROTOR_OBSERVER_DEFAULTS; //!<Датчиковый наблюдатель потокосцепления ротора асинхронного двигателя
|
||||
TCANtoRS CANtoRS = CAN_TO_RS_DEFAULTS; //!<Модуль для работы с драйвером CANopen через UART (RS). Посылки CAN запаковываются в UART
|
||||
//TModBus ModBus = MODBUS_DEFAULTS; //!<Драйвер для работы по протоколу MODBUS
|
||||
//TMBVarsConv MBVarsConv = MBVARSCONV_DEFAULTS;//!< Модуль преобразования данных из формата 16 разрядов Modbus в формат системы управления (IQ 24)
|
||||
TDrvInterface drv_interface = DRV_INTERFACE_DEFAULTS; //!<Интерфейс длЯ работы с банками аварий, событий и т.п.
|
||||
TLogger FaultLog = LOGGER_DEFAULTS; //!<Протоколирование аварий
|
||||
TGlobalTime global_time = GLOBAL_TIME_DEFAULTS; //!<Работа с часами
|
||||
|
||||
TRefs refs; //!< Структура с заданиями (токи, скорости)
|
||||
TCmd cmd = { 0 }; //!< Структура с командами управления
|
||||
TDrvStatus drv_status = { 0 }; //!< Текущий статус привода
|
||||
TDrvParams drv_params; //!< Параметры двигателя
|
||||
TSysSwitches sw; //!< Различные дискретные настройки системы управления
|
||||
|
||||
Uint32 VendorToken=0x11111111;//!< Уникальный ключ производителя, нужный для программы UniCON и COODEdit для различных наборов текстов разных произхводителей
|
||||
int drv_status_code; //!<Статус системы управления в виде константы (ГОТОВ, РАБОТА и т.п.)
|
||||
|
||||
//Переменные для отладки - выведены в словарь CANOpen,
|
||||
//В них можно присваивать любую другую переменную и наблюдать её
|
||||
//в UniCon, а также использовать их напрямую в ПО для отладки и менять на ходу.
|
||||
volatile long Debug1 = 0;
|
||||
volatile long Debug2 = 0;
|
||||
volatile Uint16 Debug3 = 0;
|
||||
volatile Uint16 Debug4 = 0;
|
||||
volatile long DebugW1 = 0;
|
||||
volatile long DebugW2 = 0;
|
||||
volatile long DebugW3 = 0;
|
||||
volatile long DebugW4 = 0;
|
||||
volatile float DebugF1 = 0;
|
||||
volatile float DebugF2 = 0;
|
||||
volatile float DebugF3 = 0;
|
||||
volatile float DebugF4 = 0;
|
||||
|
||||
//Счетчики прерываний модуля захвата
|
||||
Uint16 CounterCAP_isr = 0;
|
||||
Uint16 cap0_counter = 0;
|
||||
Uint16 cap1_counter = 0;
|
||||
Uint16 cap2_counter = 0;
|
||||
|
||||
Uint16 LoopCounter = 0; //!< Счетчик итераций фонового цикла
|
||||
|
||||
//!С этой функции начинается запуск программы
|
||||
//! \memberof MAIN_C
|
||||
int main(void) {
|
||||
|
||||
co1_vars.co_productCode = 51;
|
||||
co1_vars.co_revisionNumber = 1;
|
||||
|
||||
/* Настройка тактирования, включение периферии */
|
||||
SystemInit(); // Настройка клоков
|
||||
SystemCoreClockUpdate(); // Апдейти системных переменных настроенными клоками (хз зачем, необязательно)
|
||||
// Копирование некоторых функций и всех прерываний в RAM
|
||||
#if defined (__GNUC__)
|
||||
memcpy(&__isr_vector_ram_start, &__isr_vector_flash_start,
|
||||
((Uint32) (&__isr_vector_ram_end)
|
||||
- (Uint32) (&__isr_vector_ram_start)));
|
||||
#elif defined (__CMCPPARM__)
|
||||
// Для CodeMaster непонятно, как разместить таблицу прерываний во флеше, а обращатся к ней в раме,
|
||||
// так что пока так.
|
||||
#endif
|
||||
|
||||
pwm.Off(&pwm); //выключить ШИМ (на всякий случай)
|
||||
DINT;
|
||||
//Инициализация, собственно, всего.
|
||||
sm_sys.init(&sm_sys);
|
||||
EINT;//разрешение прерываний
|
||||
|
||||
//тип и версия устройства для драйвера CANOpen
|
||||
|
||||
while (1) { //Фоновый цикл
|
||||
LoopCounter++;
|
||||
sm_sys.slow_calc(&sm_sys); //Фоновый расчет
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long CpuTimerIsr1 = 0;
|
||||
Uint16 TIsr1 = 0;
|
||||
Uint16 msCounter = 0;
|
||||
|
||||
//! Прервыние, вызываемое по таймеру с частотой 1кГц
|
||||
//! \memberof MAIN_C
|
||||
void TMR1_IRQHandler(void) {
|
||||
CpuTimerIsr1 = TMR2->VALUE; //Засекается время выполнения функции
|
||||
sm_sys.ms_calc(&sm_sys); //миллисекундный расчет всего
|
||||
|
||||
msCounter++;
|
||||
|
||||
TIsr1 = (CpuTimerIsr1 - TMR2->VALUE) & 0xFFFFFF; //время выполнения функции
|
||||
if (TIsr1 > 97000) {
|
||||
sm_prot.bit_fault1 |= F_PROGRAM_1K; //если расчет слишком долгий, ошибка
|
||||
}
|
||||
|
||||
TMR1->INTSTATUS_bit.INT = 1; //сброс прерывания
|
||||
}
|
||||
|
||||
Uint16 FastCounter = 0;
|
||||
unsigned long CpuTimerIsr10 = 0;
|
||||
Uint16 TIsr10 = 0;
|
||||
|
||||
//! Прервыние, вызываемое по таймеру с частотой 10кГц
|
||||
//! \memberof MAIN_C
|
||||
void TMR0_IRQHandler(void) {
|
||||
CpuTimerIsr10 = TMR2->VALUE; //Засекается время выполнения функции
|
||||
sm_sys.fast_calc(&sm_sys); //расчет 10кГц всего
|
||||
|
||||
FastCounter++;
|
||||
TIsr10 = (CpuTimerIsr10 - TMR2->VALUE) & 0xFFFFFF; //время выполнения функции
|
||||
if (TIsr10 > 9700) {
|
||||
sm_prot.bit_fault1 |= F_PROGRAM_10K; //если расчет слишком долгий, ошибка
|
||||
}
|
||||
TMR0->INTSTATUS_bit.INT = 1; //сброс прерывания
|
||||
}
|
||||
|
||||
Uint16 ePWM0_TZ_isr_counter = 0;
|
||||
//!Прерывание, возникающее при аппаратной аварии
|
||||
//! \memberof MAIN_C
|
||||
#if defined (__GNUC__)
|
||||
void PWM0_TZ_IRQHandler(void)
|
||||
#elif defined (__CMCPPARM__)
|
||||
void PWM0_TZ_IRQHandler(void)
|
||||
#endif
|
||||
{
|
||||
//Так как аппаратная авария возникает при включении ШИМ
|
||||
//и удерживается пока заряжаются будстрепные конденсаторы,
|
||||
//в прерывании на нее не реагируем
|
||||
//Хотя в "настоящем" инверторе на высокое напряжение это, конечно, надо делать
|
||||
//Здесь микросхема драйверов защитит всё сама, такого выхода у неё нет
|
||||
ePWM0_TZ_isr_counter++;
|
||||
/*
|
||||
pwm12.Off(&pwm12);
|
||||
|
||||
if (sm_ctrl.state!=CTRL_STOP)
|
||||
{
|
||||
sm_prot.bit_fault1|= F_PDPINT;
|
||||
}
|
||||
sm_ctrl.state=CTRL_STOP;
|
||||
//сбрасываем флаги прерываний по этой ножке
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
//!Прерывание, возникающее по событиям захвата модуля CAP0
|
||||
//! \memberof MAIN_C
|
||||
#if defined (__GNUC__)
|
||||
void ECAP0_IRQHandler(void)
|
||||
#elif defined (__CMCPPARM__)
|
||||
void CAP0_IRQHandler(void)
|
||||
#endif
|
||||
{
|
||||
//Подтверждаем это прерывание для NVIC - иначе при выходе из функции оно возникнет опять
|
||||
ECAP0->PEINT = 1;
|
||||
|
||||
if (DPReCAP.CAPCalcEna1 == 0) { //если функция вызвалась повторно
|
||||
DPReCAP.CAP_WrongEdgeCnt = (++DPReCAP.CAP_WrongEdgeCnt) & 0xFF;
|
||||
DPReCAP.CAP_WrongEdgeCnt1++;
|
||||
return;
|
||||
}
|
||||
DPReCAP.CAPCalcEna1 = 0;//расчет будет разрешен, когда тикнет прерывание 10кГц. Чаще считать нет смысла, это помехи
|
||||
|
||||
CounterCAP_isr++;//общий счётчик всех прерываний модуля захвата
|
||||
CounterCAP_isr = CounterCAP_isr & 0xF;
|
||||
cap0_counter++;//счётчик прерываний именно этого канала
|
||||
//исходя из состояния ног трех датчиков Холла высчитывает текущий угол с точностью 60 градусов.
|
||||
//выходом функции является DPReCAP.Angle6 - угол с точностью 60 градусов.
|
||||
DPReCAP.Angle6Calc(&DPReCAP);
|
||||
//обработчик модуля захвата канала1 (0, если считать с нуля, но не переименовывать же какждый раз функции, в зависимости от версии заголовочных файлов...).
|
||||
//Засекает время между этим импульсом и предыдущими для расчета интерполятора угла и частоты вращения (скорости)
|
||||
DPReCAP.CAP1Calc(&DPReCAP);
|
||||
|
||||
//Подтверждение прерываний
|
||||
ECAP0->ECCLR_bit.CEVT0 = 1;
|
||||
ECAP0->ECCLR_bit.CEVT1 = 1;
|
||||
ECAP0->ECCLR_bit.INT = 1;
|
||||
|
||||
}
|
||||
|
||||
//!Прерывание, возникающее по событиям захвата модуля CAP1
|
||||
//! \memberof MAIN_C
|
||||
#if defined (__GNUC__)
|
||||
void ECAP1_IRQHandler(void)
|
||||
#elif defined (__CMCPPARM__)
|
||||
void CAP1_IRQHandler(void)
|
||||
#endif
|
||||
{
|
||||
//Подтверждаем это прерывание для NVIC - иначе при выходе из функции оно возникнет опять
|
||||
ECAP1->PEINT = 1;
|
||||
|
||||
if (DPReCAP.CAPCalcEna2 == 0) { //если функция вызвалась повторно
|
||||
DPReCAP.CAP_WrongEdgeCnt = (++DPReCAP.CAP_WrongEdgeCnt) & 0xFF;
|
||||
DPReCAP.CAP_WrongEdgeCnt2++;
|
||||
return;
|
||||
}
|
||||
DPReCAP.CAPCalcEna2 = 0;
|
||||
|
||||
CounterCAP_isr++;
|
||||
CounterCAP_isr = CounterCAP_isr & 0xF;
|
||||
cap1_counter++;
|
||||
DPReCAP.Angle6Calc(&DPReCAP);
|
||||
DPReCAP.CAP2Calc(&DPReCAP);
|
||||
|
||||
//Подтверждение прерываний
|
||||
ECAP1->ECCLR_bit.CEVT0 = 1;
|
||||
ECAP1->ECCLR_bit.CEVT1 = 1;
|
||||
ECAP1->ECCLR_bit.INT = 1;
|
||||
}
|
||||
|
||||
|
||||
//!Прерывание, возникающее по событиям захвата модуля CAP2
|
||||
//! \memberof MAIN_C
|
||||
#if defined (__GNUC__)
|
||||
void ECAP2_IRQHandler(void)
|
||||
#elif defined (__CMCPPARM__)
|
||||
void CAP2_IRQHandler(void)
|
||||
#endif
|
||||
{
|
||||
//Подтверждаем это прерывание для NVIC - иначе при выходе из функции оно возникнет опять
|
||||
ECAP2->PEINT = 1;
|
||||
|
||||
if (DPReCAP.CAPCalcEna3 == 0) { //если функция вызвалась повторно
|
||||
DPReCAP.CAP_WrongEdgeCnt = (++DPReCAP.CAP_WrongEdgeCnt) & 0xFF;
|
||||
DPReCAP.CAP_WrongEdgeCnt3++;
|
||||
return;
|
||||
}
|
||||
DPReCAP.CAPCalcEna3 = 0;
|
||||
|
||||
CounterCAP_isr++;
|
||||
CounterCAP_isr = CounterCAP_isr & 0xF;
|
||||
cap2_counter++;
|
||||
DPReCAP.Angle6Calc(&DPReCAP); //если убрать, то в момент прихода метки на один период ШИМ косяк, так как прерывание посчиталось, а Angle6Calc нет
|
||||
DPReCAP.CAP3Calc(&DPReCAP);
|
||||
|
||||
//Подтверждение прерываний
|
||||
ECAP2->ECCLR_bit.CEVT0 = 1;
|
||||
ECAP2->ECCLR_bit.CEVT1 = 1;
|
||||
ECAP2->ECCLR_bit.INT = 1;
|
||||
}
|
||||
|
||||
//!Прерывание, возникающее по событию реперной метки(индекса) модуля QEP
|
||||
//! \memberof MAIN_C
|
||||
//! Но - на двигателе ACM601V36-1000 нет индексной метки.
|
||||
//Так что этого прерывания c таким двигателем не будет (или будет от помех, как повезет)
|
||||
#if defined (__GNUC__)
|
||||
void QEP_IRQHandler(void)
|
||||
#elif defined (__CMCPPARM__)
|
||||
void QEP1_IRQHandler(void)
|
||||
#endif
|
||||
{
|
||||
//Обработка репера
|
||||
posspeedEqep.index(&posspeedEqep);
|
||||
//Подтверждаем это прерывание для NVIC
|
||||
QEP->INTCLR = 1;
|
||||
QEP->QCLR_bit.IEL = 1;
|
||||
QEP->QCLR_bit.INT = 1;
|
||||
}
|
||||
|
||||
//Прерывание вызывается один раз на периоде ШИМ и забирает 4 результата за период
|
||||
void ADC_SEQ0_IRQHandler (void) {
|
||||
adc.fast_calc(&adc);
|
||||
|
||||
dlog.update(&dlog); //Осциллографирование данных
|
||||
ADC->IC_bit.SEQIC0 = 1;
|
||||
}
|
||||
/*@}*/
|
||||
|
47
Vsrc/park.c
Normal file
47
Vsrc/park.c
Normal file
@ -0,0 +1,47 @@
|
||||
/*!
|
||||
Copyright 2017 ÀÎ "ÍÈÈÝÒ" è ÎÎÎ "ÍÏÔ ÂÅÊÒÎÐ"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
\file park.c
|
||||
\brief Ìîäóëü êîîðäèíàòíûõ ïðåîáðàçîâàíèé êîîðäèíàò (ñì. TPark)
|
||||
\author ÎÎÎ "ÍÏÔ Âåêòîð". http://motorcontrol.ru
|
||||
\version v 2.0 25/03/2016
|
||||
|
||||
\addtogroup Park
|
||||
@{
|
||||
*/
|
||||
|
||||
#include "V_IQmath.h" /* Include header for IQmath library */
|
||||
#include "park.h"
|
||||
|
||||
//! Ôóíêöèÿ ïðåîáðàçîâàíèé êîîðäèíàò
|
||||
|
||||
//!Íà âõîäå óãîë ang, âåêòîð (ds,qs).
|
||||
//!Íà âûõîäå ïîâåðíóòûé íà çàäàííûé óãîë âåêòîð (de,qe)
|
||||
//! \memberof TPark
|
||||
void park_calc(TPark *v) {
|
||||
|
||||
_iq cos_ang, sin_ang;
|
||||
|
||||
/* Using look-up IQ sine table */
|
||||
sin_ang = _IQsinPU(v->ang);
|
||||
cos_ang = _IQcosPU(v->ang);
|
||||
|
||||
v->de = _IQmpy(v->ds,cos_ang) + _IQmpy(v->qs, sin_ang);
|
||||
v->qe = _IQmpy(v->qs,cos_ang) - _IQmpy(v->ds, sin_ang);
|
||||
|
||||
}
|
||||
|
||||
/*@}*/
|
||||
|
307
asm/startup_K1921VK035_vector.S
Normal file
307
asm/startup_K1921VK035_vector.S
Normal file
@ -0,0 +1,307 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file startup_MCP.s
|
||||
* @author Vector / NIIET
|
||||
* @version V1.0.0
|
||||
* @date 28 - September - 2014
|
||||
* @brief NIIET MC01 vector table for Sourcery Codebench.
|
||||
* This module performs:
|
||||
* - Set the initial SP
|
||||
* - Set the initial PC == Reset_Handler,
|
||||
* - Set the vector table entries with the exceptions ISR address
|
||||
* - Branches to main in the C library (which eventually
|
||||
* calls main()).
|
||||
* - enables FPU (COMING SOON!)
|
||||
* After Reset the Cortex-M4 processor is in Thread mode,
|
||||
* priority is Privileged, and the Stack is set to Main.
|
||||
*/
|
||||
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.fpu vfpv4
|
||||
.thumb
|
||||
|
||||
.global g_pfnVectors
|
||||
.global Default_Handler
|
||||
|
||||
/* start address for the initialization values of the .data section.
|
||||
defined in linker script */
|
||||
.word _sidata
|
||||
/* start address for the .data section. defined in linker script */
|
||||
.word _sdata
|
||||
/* end address for the .data section. defined in linker script */
|
||||
.word _edata
|
||||
/* start address for the .bss section. defined in linker script */
|
||||
.word _sbss
|
||||
/* end address for the .bss section. defined in linker script */
|
||||
.word _ebss
|
||||
/* stack used for SystemInit_ExtMemCtl; always internal RAM used */
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor first
|
||||
* starts execution following a reset event. Only the absolutely
|
||||
* necessary set is performed, after which the application
|
||||
* supplied main() routine is called.
|
||||
* @param None
|
||||
* @retval : None
|
||||
*/
|
||||
|
||||
.section .text.Reset_Handler
|
||||
.weak Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
|
||||
/* Copy the data segment initializers from flash to SRAM */
|
||||
movs r1, #0
|
||||
b LoopCopyDataInit
|
||||
|
||||
CopyDataInit:
|
||||
ldr r3, =_sidata
|
||||
ldr r3, [r3, r1]
|
||||
str r3, [r0, r1]
|
||||
adds r1, r1, #4
|
||||
|
||||
LoopCopyDataInit:
|
||||
ldr r0, =_sdata
|
||||
ldr r3, =_edata
|
||||
adds r2, r0, r1
|
||||
cmp r2, r3
|
||||
bcc CopyDataInit
|
||||
ldr r2, =_sbss
|
||||
b LoopFillZerobss
|
||||
/* Zero fill the bss segment. */
|
||||
FillZerobss:
|
||||
movs r3, #0
|
||||
str r3, [r2], #4
|
||||
|
||||
LoopFillZerobss:
|
||||
ldr r3, = _ebss
|
||||
cmp r2, r3
|
||||
bcc FillZerobss
|
||||
|
||||
|
||||
/* Âêëþ÷åíèå ïëàâîòî÷êè*/
|
||||
|
||||
ldr.w R0, =0xE000ED88
|
||||
ldr R1, [R0]
|
||||
orr R1, R1, #(0xF << 20)
|
||||
str R1, [R0]
|
||||
dsb
|
||||
isb /*reset pipeline now the FPU is enabled*/
|
||||
|
||||
ldr r0, = _estack /* Ýòè äâå ñòðîêè - çàãðóçêà SP àäðåñîì 2000à000 â ñëó÷àå, åñëè ôëåøêà ïîò¸ðòà. Åñëè ïðîåêò øü¸òñÿ âî ôëåø - óäàëèòü.*/
|
||||
msr msp, r0 /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
||||
bl main
|
||||
bx lr
|
||||
.size Reset_Handler, .-Reset_Handler
|
||||
|
||||
/**
|
||||
* @brief This is the code that gets called when the processor receives an
|
||||
* unexpected interrupt. This simply enters an infinite loop, preserving
|
||||
* the system state for examination by a debugger.
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
.section .text.Default_Handler,"ax",%progbits
|
||||
Default_Handler:
|
||||
Infinite_Loop:
|
||||
b Infinite_Loop
|
||||
.size Default_Handler, .-Default_Handler
|
||||
/******************************************************************************
|
||||
*
|
||||
* The minimal vector table for a Cortex M3. Note that the proper constructs
|
||||
* must be placed on this to ensure that it ends up at physical address
|
||||
* 0x0000.0000.
|
||||
*
|
||||
*******************************************************************************/
|
||||
.section .isr_vector,"a",%progbits
|
||||
.type g_pfnVectors, %object
|
||||
.size g_pfnVectors, .-g_pfnVectors
|
||||
|
||||
|
||||
g_pfnVectors:
|
||||
.word _estack
|
||||
.word Reset_Handler
|
||||
.word NMI_Handler
|
||||
.word HardFault_Handler
|
||||
.word MemManage_Handler
|
||||
.word BusFault_Handler
|
||||
.word UsageFault_Handler
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word SVC_Handler
|
||||
.word DebugMon_Handler
|
||||
.word 0
|
||||
.word PendSV_Handler
|
||||
.word SysTick_Handler
|
||||
|
||||
|
||||
.word WDT_IRQHandler
|
||||
.word RCU_IRQHandler
|
||||
.word MFLASH_IRQHandler
|
||||
.word GPIOA_IRQHandler
|
||||
.word GPIOB_IRQHandler
|
||||
.word DMA_CH0_IRQHandler
|
||||
.word DMA_CH1_IRQHandler
|
||||
.word DMA_CH2_IRQHandler
|
||||
.word DMA_CH3_IRQHandler
|
||||
.word DMA_CH4_IRQHandler
|
||||
.word DMA_CH5_IRQHandler
|
||||
.word DMA_CH6_IRQHandler
|
||||
.word DMA_CH7_IRQHandler
|
||||
.word DMA_CH8_IRQHandler
|
||||
.word DMA_CH9_IRQHandler
|
||||
.word DMA_CH10_IRQHandler
|
||||
.word DMA_CH11_IRQHandler
|
||||
.word DMA_CH12_IRQHandler
|
||||
.word DMA_CH13_IRQHandler
|
||||
.word DMA_CH14_IRQHandler
|
||||
.word DMA_CH15_IRQHandler
|
||||
.word TMR0_IRQHandler
|
||||
.word TMR1_IRQHandler
|
||||
.word TMR2_IRQHandler
|
||||
.word TMR3_IRQHandler
|
||||
.word UART0_TD_IRQHandler
|
||||
.word UART0_RX_IRQHandler
|
||||
.word UART0_TX_IRQHandler
|
||||
.word UART0_E_RT_IRQHandler
|
||||
.word UART1_TD_IRQHandler
|
||||
.word UART1_RX_IRQHandler
|
||||
.word UART1_TX_IRQHandler
|
||||
.word UART1_E_RT_IRQHandler
|
||||
.word SPI_RO_RT_IRQHandler
|
||||
.word SPI_RX_IRQHandler
|
||||
.word SPI_TX_IRQHandler
|
||||
.word I2C_IRQHandler
|
||||
.word ECAP0_IRQHandler
|
||||
.word ECAP1_IRQHandler
|
||||
.word ECAP2_IRQHandler
|
||||
.word PWM0_IRQHandler
|
||||
.word PWM0_HD_IRQHandler
|
||||
.word PWM0_TZ_IRQHandler
|
||||
.word PWM1_IRQHandler
|
||||
.word PWM1_HD_IRQHandler
|
||||
.word PWM1_TZ_IRQHandler
|
||||
.word PWM2_IRQHandler
|
||||
.word PWM2_HD_IRQHandler
|
||||
.word PWM2_TZ_IRQHandler
|
||||
.word QEP_IRQHandler
|
||||
.word ADC_SEQ0_IRQHandler
|
||||
.word ADC_SEQ1_IRQHandler
|
||||
.word ADC_DC_IRQHandler
|
||||
.word CAN0_IRQHandler
|
||||
.word CAN1_IRQHandler
|
||||
.word CAN2_IRQHandler
|
||||
.word CAN3_IRQHandler
|
||||
.word CAN4_IRQHandler
|
||||
.word CAN5_IRQHandler
|
||||
.word CAN6_IRQHandler
|
||||
.word CAN7_IRQHandler
|
||||
.word CAN8_IRQHandler
|
||||
.word CAN9_IRQHandler
|
||||
.word CAN10_IRQHandler
|
||||
.word CAN11_IRQHandler
|
||||
.word CAN12_IRQHandler
|
||||
.word CAN13_IRQHandler
|
||||
.word CAN14_IRQHandler
|
||||
.word CAN15_IRQHandler
|
||||
.word FPU_IRQHandler
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Provide weak aliases for each Exception handler to the Default_Handler.
|
||||
* As they are weak aliases, any function with the same name will override
|
||||
* this definition.
|
||||
*
|
||||
*******************************************************************************/
|
||||
/* Macro to define default handlers. Default handler
|
||||
* will be weak symbol and just dead loops. They can be
|
||||
* overwritten by other handlers */
|
||||
.macro def_irq_handler handler_name
|
||||
.weak \handler_name
|
||||
.thumb_set \handler_name, Default_Handler
|
||||
.endm
|
||||
|
||||
def_irq_handler NMI_Handler
|
||||
def_irq_handler HardFault_Handler
|
||||
def_irq_handler MemManage_Handler
|
||||
def_irq_handler BusFault_Handler
|
||||
def_irq_handler UsageFault_Handler
|
||||
def_irq_handler SVC_Handler
|
||||
def_irq_handler DebugMon_Handler
|
||||
def_irq_handler PendSV_Handler
|
||||
def_irq_handler SysTick_Handler
|
||||
|
||||
/* External Interrupt Handlers */
|
||||
def_irq_handler WDT_IRQHandler
|
||||
def_irq_handler RCU_IRQHandler
|
||||
def_irq_handler MFLASH_IRQHandler
|
||||
def_irq_handler GPIOA_IRQHandler
|
||||
def_irq_handler GPIOB_IRQHandler
|
||||
def_irq_handler DMA_CH0_IRQHandler
|
||||
def_irq_handler DMA_CH1_IRQHandler
|
||||
def_irq_handler DMA_CH2_IRQHandler
|
||||
def_irq_handler DMA_CH3_IRQHandler
|
||||
def_irq_handler DMA_CH4_IRQHandler
|
||||
def_irq_handler DMA_CH5_IRQHandler
|
||||
def_irq_handler DMA_CH6_IRQHandler
|
||||
def_irq_handler DMA_CH7_IRQHandler
|
||||
def_irq_handler DMA_CH8_IRQHandler
|
||||
def_irq_handler DMA_CH9_IRQHandler
|
||||
def_irq_handler DMA_CH10_IRQHandler
|
||||
def_irq_handler DMA_CH11_IRQHandler
|
||||
def_irq_handler DMA_CH12_IRQHandler
|
||||
def_irq_handler DMA_CH13_IRQHandler
|
||||
def_irq_handler DMA_CH14_IRQHandler
|
||||
def_irq_handler DMA_CH15_IRQHandler
|
||||
def_irq_handler TMR0_IRQHandler
|
||||
def_irq_handler TMR1_IRQHandler
|
||||
def_irq_handler TMR2_IRQHandler
|
||||
def_irq_handler TMR3_IRQHandler
|
||||
def_irq_handler UART0_TD_IRQHandler
|
||||
def_irq_handler UART0_RX_IRQHandler
|
||||
def_irq_handler UART0_TX_IRQHandler
|
||||
def_irq_handler UART0_E_RT_IRQHandler
|
||||
def_irq_handler UART1_TD_IRQHandler
|
||||
def_irq_handler UART1_RX_IRQHandler
|
||||
def_irq_handler UART1_TX_IRQHandler
|
||||
def_irq_handler UART1_E_RT_IRQHandler
|
||||
def_irq_handler SPI_RO_RT_IRQHandler
|
||||
def_irq_handler SPI_RX_IRQHandler
|
||||
def_irq_handler SPI_TX_IRQHandler
|
||||
def_irq_handler I2C_IRQHandler
|
||||
def_irq_handler ECAP0_IRQHandler
|
||||
def_irq_handler ECAP1_IRQHandler
|
||||
def_irq_handler ECAP2_IRQHandler
|
||||
def_irq_handler PWM0_IRQHandler
|
||||
def_irq_handler PWM0_HD_IRQHandler
|
||||
def_irq_handler PWM0_TZ_IRQHandler
|
||||
def_irq_handler PWM1_IRQHandler
|
||||
def_irq_handler PWM1_HD_IRQHandler
|
||||
def_irq_handler PWM1_TZ_IRQHandler
|
||||
def_irq_handler PWM2_IRQHandler
|
||||
def_irq_handler PWM2_HD_IRQHandler
|
||||
def_irq_handler PWM2_TZ_IRQHandler
|
||||
def_irq_handler QEP_IRQHandler
|
||||
def_irq_handler ADC_SEQ0_IRQHandler
|
||||
def_irq_handler ADC_SEQ1_IRQHandler
|
||||
def_irq_handler ADC_DC_IRQHandler
|
||||
def_irq_handler CAN0_IRQHandler
|
||||
def_irq_handler CAN1_IRQHandler
|
||||
def_irq_handler CAN2_IRQHandler
|
||||
def_irq_handler CAN3_IRQHandler
|
||||
def_irq_handler CAN4_IRQHandler
|
||||
def_irq_handler CAN5_IRQHandler
|
||||
def_irq_handler CAN6_IRQHandler
|
||||
def_irq_handler CAN7_IRQHandler
|
||||
def_irq_handler CAN8_IRQHandler
|
||||
def_irq_handler CAN9_IRQHandler
|
||||
def_irq_handler CAN10_IRQHandler
|
||||
def_irq_handler CAN11_IRQHandler
|
||||
def_irq_handler CAN12_IRQHandler
|
||||
def_irq_handler CAN13_IRQHandler
|
||||
def_irq_handler CAN14_IRQHandler
|
||||
def_irq_handler CAN15_IRQHandler
|
||||
def_irq_handler FPU_IRQHandler
|
242
cmd/build.ld
Normal file
242
cmd/build.ld
Normal file
@ -0,0 +1,242 @@
|
||||
/******************************************************************************
|
||||
Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР"
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
* @file build.ld
|
||||
* @brief Файл распределения памяти для выполнения из FLASH
|
||||
* @version v1.0
|
||||
* @date 11 декабря 2015
|
||||
*
|
||||
* @author ООО "НПФ Вектор", http://motorcontrol.ru
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/* Entry Point */
|
||||
ENTRY(Reset_Handler)
|
||||
|
||||
|
||||
/* Generate a link error if heap and stack don't fit into RAM */
|
||||
_Stack_Size = 0x1000; /* required amount of stack */
|
||||
|
||||
/* Specify the memory areas */
|
||||
/* Буквы в скобках определяют атрибуты: доступ на чтение,
|
||||
* запись, исполнение, выделение памяти. */
|
||||
MEMORY
|
||||
{
|
||||
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x10000
|
||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x4000
|
||||
}
|
||||
/* Конец РАМы на НИИЭТЕ (с запасиком) - отсюда внутрь будет расти стек*/
|
||||
_estack = ORIGIN(RAM) + LENGTH(RAM) - 4;
|
||||
|
||||
|
||||
/* Define output sections */
|
||||
SECTIONS
|
||||
{
|
||||
. = ORIGIN(RAM);
|
||||
/* таблица векторов прерываний, обязана быть выровнена по 0х80 */
|
||||
.isr_vector ALIGN(0x80):
|
||||
{
|
||||
__isr_vector_flash_start = LOADADDR (.isr_vector); /* Берем адрес, где на флеше лежит эта таблица */
|
||||
__isr_vector_ram_start = .;
|
||||
KEEP(*(.isr_vector)) /* Startup code - KEEP запрещает удалить секцию сборщику мусора */
|
||||
. = ALIGN(4);
|
||||
__isr_vector_ram_end = .; /* конец оперативки, куда будет скопирован код */
|
||||
} >RAM AT>FLASH
|
||||
|
||||
/* Секция для кода, который исполняется в оперативке, а лежит на флеше.
|
||||
* В начале мейна он копируется из ROM в RAM.*/
|
||||
.fastcode ALIGN(4): {
|
||||
__fastcode_flash_start = LOADADDR (.fastcode); /* Берем адрес, где на флеше лежит код. */
|
||||
/* Точка - это курсор текущего размещения в памяти. Т.е. в
|
||||
* __fastcode_ram_start будет лежать адрес оперативки, где будет исполняться скопированный код.*/
|
||||
__fastcode_ram_start = .;
|
||||
*(.glue_7t) *(.glue_7)
|
||||
*(.fastcode)
|
||||
*(.fastcode*)
|
||||
. = ALIGN (4);
|
||||
__fastcode_ram_end = .; /* конец оперативки, куда будет скопирован код */
|
||||
} >RAM AT>FLASH
|
||||
|
||||
/* The program code and other data goes into RAM */
|
||||
.text :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
*(.text) /* .text sections (code) */
|
||||
*(.text*) /* .text* sections (code) */
|
||||
*(.rodata) /* .rodata sections (constants, strings, etc.) */
|
||||
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
|
||||
*(.glue_7) /* glue arm to thumb code */
|
||||
*(.glue_7t) /* glue thumb to arm code */
|
||||
*(.eh_frame)
|
||||
|
||||
KEEP (*(.init))
|
||||
KEEP (*(.fini))
|
||||
|
||||
. = ALIGN(4);
|
||||
|
||||
/* define a global symbols at end of code - указатель на конец кода,
|
||||
т.к. точка - это переменная с инкрементирующимся значением адреса (называют её курсор)*/
|
||||
_etext = .;
|
||||
} >FLASH
|
||||
|
||||
|
||||
/* .preinit_array - секция для указателей на функции пре-инициализации,
|
||||
* вызываемых перед любыми другими функциями
|
||||
* инициализации (перед выполнением кода из секции
|
||||
* '.init' и вызовами функций из секции '.init_array').
|
||||
*
|
||||
* Специальная секция с именем '.preinit_array' и вышеназванным
|
||||
* назначением описана в System V gABI. Вызов функций, указатели на
|
||||
* которые содержатся в секции '.preinit_array', возлагается на библиотеку
|
||||
* времени выполнения (runtime library) -- например, на C runtime. Если в
|
||||
* библиотеке не предусмотрен такой вызов, то функции из секции
|
||||
* '.preinit_array' не будут вызваны.
|
||||
*
|
||||
* Секция '.preinit_array' предназначена для пре-инициализации
|
||||
* исполняемого файла (executable), выполняемой перед инициализацией
|
||||
* динамически скомпонованных с ним разделяемых объектов (shared objects).
|
||||
*
|
||||
* Символы __preinit_array_start и __preinit_array_end используются
|
||||
* библиотекой C времени выполнения (newlib, glibc).
|
||||
*/
|
||||
.preinit_array :
|
||||
{
|
||||
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||
KEEP (*(.preinit_array*))
|
||||
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||
} >FLASH
|
||||
|
||||
/* .init_array - секции с указателями на функции инициализации,
|
||||
* выполняющиеся перед вызовом входной точки программы, т.е.
|
||||
* перед вызовом функции main.
|
||||
*
|
||||
* Специальная секция с именем '.init_array' и вышеназванным назначением
|
||||
* описана в System V gABI. Вызов функций, указатели на которые содержатся в
|
||||
* секции '.init_array', возлагается на библиотеку времени выполнения
|
||||
* (runtime library) -- например, на C runtime. Если в библиотеке не
|
||||
* предусмотрен такой вызов, то функции из секции '.init_array' не будут
|
||||
* вызваны.
|
||||
*
|
||||
* GCC использует секцию '.init_array' для обеспечения вызова статических
|
||||
* конструкторов: функций, объявленных с __attribute__((constructor)).
|
||||
*
|
||||
* Для статических конструкторов с объявленным приоритетом PRIORITY,
|
||||
* используются секции с именем '.init_array.PRIORITY'
|
||||
*
|
||||
* Также GCC использует секцию '.init_array' для вызова конструкторов
|
||||
* статических объектов C++.
|
||||
*
|
||||
* Символы __init_array_start и __init_array_end используются библиотекой
|
||||
* C времени выполнения (newlib, glibc).
|
||||
*/
|
||||
.init_array :
|
||||
{
|
||||
PROVIDE_HIDDEN (__init_array_start = .);
|
||||
KEEP (*(SORT(.init_array.*)))
|
||||
KEEP (*(.init_array*))
|
||||
PROVIDE_HIDDEN (__init_array_end = .);
|
||||
} >FLASH
|
||||
/* .fini_array - секции с указателями на функции терминации,
|
||||
* выполняющиеся по завершению программы (после возврата из
|
||||
* входной точки программы, т.е. из функции main).
|
||||
*
|
||||
* Специальная секция с именем '.fini_array' и вышеназванным назначением
|
||||
* описана в System V gABI. Вызов функций, указатели на которые содержатся в
|
||||
* секции '.fini_array', возлагается на библиотеку времени выполнения
|
||||
* (runtime library) -- например, на C runtime. Если в библиотеке не
|
||||
* предусмотрен такой вызов, то функции из секции '.fini_array' не будут
|
||||
* вызваны.
|
||||
*
|
||||
* GCC использует секцию '.fini_array' для обеспечения вызова статических
|
||||
* деструкторов: функций, объявленных с __attribute__((destructor)).
|
||||
*
|
||||
* Для статических деструкторов с объявленным приоритетом PRIORITY,
|
||||
* используются секции с именем '.fini_array.PRIORITY'
|
||||
*
|
||||
* Символы __fini_array_start и __fini_array_end используются библиотекой
|
||||
* C времени выполнения (newlib, glibc).
|
||||
*/
|
||||
.fini_array :
|
||||
{
|
||||
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||
KEEP (*(.fini_array*))
|
||||
KEEP (*(SORT(.fini_array.*)))
|
||||
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||
} >FLASH
|
||||
|
||||
/* used by the startup to initialize data */
|
||||
_sidata = .;
|
||||
|
||||
|
||||
/* Выражение _sidata, которое следует за ключевым словом AT,
|
||||
* определяет адрес загрузки секции. По умолчанию, если Вы
|
||||
* не использовали ключевое слово AT, адрес загрузки равен адресу перемещения.
|
||||
* Так как _sidata до этого было равно точке (указатель на текущий адрес),
|
||||
* то .data пойдет сразу дальше после неё. Как бы динамическое смещение такое.
|
||||
* */
|
||||
/* Initialized data sections goes into RAM, load LMA copy after code */
|
||||
.data : AT ( _sidata )
|
||||
{
|
||||
. = ALIGN(4);
|
||||
_sdata = .; /* create a global symbol at data start */
|
||||
*(.data) /* .data sections */
|
||||
*(.data*) /* .data* sections */
|
||||
|
||||
. = ALIGN(4);
|
||||
_edata = .; /* define a global symbol at data end */
|
||||
} >RAM
|
||||
_________________________ZHOPA__________________________ = .;
|
||||
/* Uninitialized data section */
|
||||
. = ALIGN(4);
|
||||
.bss :
|
||||
{
|
||||
/* This is used by the startup in order to initialize the .bss secion */
|
||||
_sbss = .; /* define a global symbol at bss start */
|
||||
__bss_start__ = _sbss;
|
||||
*(.bss)
|
||||
*(.bss*)
|
||||
*(COMMON)
|
||||
|
||||
. = ALIGN(4);
|
||||
_ebss = .; /* define a global symbol at bss end */
|
||||
__bss_end__ = _ebss;
|
||||
} >RAM
|
||||
|
||||
|
||||
/* Функци проверяет, что после всего кода осталось место под стек.
|
||||
* Стек сделан снизу оперативки!
|
||||
* Не размещайте свои секции после этой функции, только перед!*/
|
||||
._user_heap_stack :
|
||||
{
|
||||
. = ALIGN(4);
|
||||
PROVIDE ( end = . );
|
||||
PROVIDE ( _end = . );
|
||||
. = . + _Stack_Size + 4;
|
||||
. = ALIGN(4);
|
||||
} >RAM
|
||||
|
||||
|
||||
/* Remove information from the standard libraries */
|
||||
/DISCARD/ :
|
||||
{
|
||||
libc.a ( * )
|
||||
libm.a ( * )
|
||||
libgcc.a ( * )
|
||||
}
|
||||
|
||||
/* Тут какие-то атрибуты об особенностях компиляции, специфичная инфа производителя и хз еще что, читайте
|
||||
* 4.3.6 Build Attributes http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044e/IHI0044E_aaelf.pdf */
|
||||
.ARM.attributes 0 : { *(.ARM.attributes) }
|
||||
}
|
10232
include/K1921VK035.h
Normal file
10232
include/K1921VK035.h
Normal file
File diff suppressed because it is too large
Load Diff
1758
include/core_cm4.h
Normal file
1758
include/core_cm4.h
Normal file
File diff suppressed because it is too large
Load Diff
650
include/core_cm4_simd.h
Normal file
650
include/core_cm4_simd.h
Normal file
@ -0,0 +1,650 @@
|
||||
/**************************************************************************//**
|
||||
* @file core_cm4_simd.h
|
||||
* @brief CMSIS Cortex-M4 SIMD Header File
|
||||
* @version V3.01
|
||||
* @date 06. March 2012
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2010-2012 ARM Limited. All rights reserved.
|
||||
*
|
||||
* @par
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* @par
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef __CORE_CM4_SIMD_H
|
||||
#define __CORE_CM4_SIMD_H
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Hardware Abstraction Layer
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/* ################### Compiler specific Intrinsics ########################### */
|
||||
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
|
||||
Access to dedicated SIMD instructions
|
||||
@{
|
||||
*/
|
||||
|
||||
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
||||
/* ARM armcc specific functions */
|
||||
|
||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
#define __SADD8 __sadd8
|
||||
#define __QADD8 __qadd8
|
||||
#define __SHADD8 __shadd8
|
||||
#define __UADD8 __uadd8
|
||||
#define __UQADD8 __uqadd8
|
||||
#define __UHADD8 __uhadd8
|
||||
#define __SSUB8 __ssub8
|
||||
#define __QSUB8 __qsub8
|
||||
#define __SHSUB8 __shsub8
|
||||
#define __USUB8 __usub8
|
||||
#define __UQSUB8 __uqsub8
|
||||
#define __UHSUB8 __uhsub8
|
||||
#define __SADD16 __sadd16
|
||||
#define __QADD16 __qadd16
|
||||
#define __SHADD16 __shadd16
|
||||
#define __UADD16 __uadd16
|
||||
#define __UQADD16 __uqadd16
|
||||
#define __UHADD16 __uhadd16
|
||||
#define __SSUB16 __ssub16
|
||||
#define __QSUB16 __qsub16
|
||||
#define __SHSUB16 __shsub16
|
||||
#define __USUB16 __usub16
|
||||
#define __UQSUB16 __uqsub16
|
||||
#define __UHSUB16 __uhsub16
|
||||
#define __SASX __sasx
|
||||
#define __QASX __qasx
|
||||
#define __SHASX __shasx
|
||||
#define __UASX __uasx
|
||||
#define __UQASX __uqasx
|
||||
#define __UHASX __uhasx
|
||||
#define __SSAX __ssax
|
||||
#define __QSAX __qsax
|
||||
#define __SHSAX __shsax
|
||||
#define __USAX __usax
|
||||
#define __UQSAX __uqsax
|
||||
#define __UHSAX __uhsax
|
||||
#define __USAD8 __usad8
|
||||
#define __USADA8 __usada8
|
||||
#define __SSAT16 __ssat16
|
||||
#define __USAT16 __usat16
|
||||
#define __UXTB16 __uxtb16
|
||||
#define __UXTAB16 __uxtab16
|
||||
#define __SXTB16 __sxtb16
|
||||
#define __SXTAB16 __sxtab16
|
||||
#define __SMUAD __smuad
|
||||
#define __SMUADX __smuadx
|
||||
#define __SMLAD __smlad
|
||||
#define __SMLADX __smladx
|
||||
#define __SMLALD __smlald
|
||||
#define __SMLALDX __smlaldx
|
||||
#define __SMUSD __smusd
|
||||
#define __SMUSDX __smusdx
|
||||
#define __SMLSD __smlsd
|
||||
#define __SMLSDX __smlsdx
|
||||
#define __SMLSLD __smlsld
|
||||
#define __SMLSLDX __smlsldx
|
||||
#define __SEL __sel
|
||||
#define __QADD __qadd
|
||||
#define __QSUB __qsub
|
||||
|
||||
#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \
|
||||
((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) )
|
||||
|
||||
#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \
|
||||
((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) )
|
||||
|
||||
|
||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
||||
/* IAR iccarm specific functions */
|
||||
|
||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
#include <cmsis_iar.h>
|
||||
|
||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
|
||||
/* TI CCS specific functions */
|
||||
|
||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
#include <cmsis_ccs.h>
|
||||
|
||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
||||
/* GNU gcc specific functions */
|
||||
|
||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
#define __SSAT16(ARG1,ARG2) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1); \
|
||||
__ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
#define __USAT16(ARG1,ARG2) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1); \
|
||||
__ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1));
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1));
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
#define __SMLALD(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
|
||||
__ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
||||
})
|
||||
|
||||
#define __SMLALDX(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \
|
||||
__ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
||||
})
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
#define __SMLSLD(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
|
||||
__ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
||||
})
|
||||
|
||||
#define __SMLSLDX(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \
|
||||
__ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \
|
||||
(uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \
|
||||
})
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
#define __PKHBT(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
|
||||
__ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
#define __PKHTB(ARG1,ARG2,ARG3) \
|
||||
({ \
|
||||
uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \
|
||||
if (ARG3 == 0) \
|
||||
__ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \
|
||||
else \
|
||||
__ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \
|
||||
__RES; \
|
||||
})
|
||||
|
||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
||||
/* TASKING carm specific functions */
|
||||
|
||||
|
||||
/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
/* not yet supported */
|
||||
/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/*@} end of group CMSIS_SIMD_intrinsics */
|
||||
|
||||
|
||||
#endif /* __CORE_CM4_SIMD_H */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
617
include/core_cmFunc.h
Normal file
617
include/core_cmFunc.h
Normal file
@ -0,0 +1,617 @@
|
||||
/**************************************************************************//**
|
||||
* @file core_cmFunc.h
|
||||
* @brief CMSIS Cortex-M Core Function Access Header File
|
||||
* @version V3.01
|
||||
* @date 06. March 2012
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2009-2012 ARM Limited. All rights reserved.
|
||||
*
|
||||
* @par
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* @par
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __CORE_CMFUNC_H
|
||||
#define __CORE_CMFUNC_H
|
||||
|
||||
|
||||
/* ########################### Core Function Access ########################### */
|
||||
/** \ingroup CMSIS_Core_FunctionInterface
|
||||
\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
|
||||
@{
|
||||
*/
|
||||
|
||||
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
||||
/* ARM armcc specific functions */
|
||||
|
||||
#if (__ARMCC_VERSION < 400677)
|
||||
#error "Please use ARM Compiler Toolchain V4.0.677 or later!"
|
||||
#endif
|
||||
|
||||
/* intrinsic void __enable_irq(); */
|
||||
/* intrinsic void __disable_irq(); */
|
||||
|
||||
/** \brief Get Control Register
|
||||
|
||||
This function returns the content of the Control Register.
|
||||
|
||||
\return Control Register value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_CONTROL(void)
|
||||
{
|
||||
register uint32_t __regControl __ASM("control");
|
||||
return(__regControl);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Control Register
|
||||
|
||||
This function writes the given value to the Control Register.
|
||||
|
||||
\param [in] control Control Register value to set
|
||||
*/
|
||||
__STATIC_INLINE void __set_CONTROL(uint32_t control)
|
||||
{
|
||||
register uint32_t __regControl __ASM("control");
|
||||
__regControl = control;
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get IPSR Register
|
||||
|
||||
This function returns the content of the IPSR Register.
|
||||
|
||||
\return IPSR Register value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_IPSR(void)
|
||||
{
|
||||
register uint32_t __regIPSR __ASM("ipsr");
|
||||
return(__regIPSR);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get APSR Register
|
||||
|
||||
This function returns the content of the APSR Register.
|
||||
|
||||
\return APSR Register value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_APSR(void)
|
||||
{
|
||||
register uint32_t __regAPSR __ASM("apsr");
|
||||
return(__regAPSR);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get xPSR Register
|
||||
|
||||
This function returns the content of the xPSR Register.
|
||||
|
||||
\return xPSR Register value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_xPSR(void)
|
||||
{
|
||||
register uint32_t __regXPSR __ASM("xpsr");
|
||||
return(__regXPSR);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Process Stack Pointer
|
||||
|
||||
This function returns the current value of the Process Stack Pointer (PSP).
|
||||
|
||||
\return PSP Register value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_PSP(void)
|
||||
{
|
||||
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||
return(__regProcessStackPointer);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Process Stack Pointer
|
||||
|
||||
This function assigns the given value to the Process Stack Pointer (PSP).
|
||||
|
||||
\param [in] topOfProcStack Process Stack Pointer value to set
|
||||
*/
|
||||
__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
|
||||
{
|
||||
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||
__regProcessStackPointer = topOfProcStack;
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Main Stack Pointer
|
||||
|
||||
This function returns the current value of the Main Stack Pointer (MSP).
|
||||
|
||||
\return MSP Register value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_MSP(void)
|
||||
{
|
||||
register uint32_t __regMainStackPointer __ASM("msp");
|
||||
return(__regMainStackPointer);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Main Stack Pointer
|
||||
|
||||
This function assigns the given value to the Main Stack Pointer (MSP).
|
||||
|
||||
\param [in] topOfMainStack Main Stack Pointer value to set
|
||||
*/
|
||||
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
|
||||
{
|
||||
register uint32_t __regMainStackPointer __ASM("msp");
|
||||
__regMainStackPointer = topOfMainStack;
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Priority Mask
|
||||
|
||||
This function returns the current state of the priority mask bit from the Priority Mask Register.
|
||||
|
||||
\return Priority Mask value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_PRIMASK(void)
|
||||
{
|
||||
register uint32_t __regPriMask __ASM("primask");
|
||||
return(__regPriMask);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Priority Mask
|
||||
|
||||
This function assigns the given value to the Priority Mask Register.
|
||||
|
||||
\param [in] priMask Priority Mask
|
||||
*/
|
||||
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
|
||||
{
|
||||
register uint32_t __regPriMask __ASM("primask");
|
||||
__regPriMask = (priMask);
|
||||
}
|
||||
|
||||
|
||||
#if (__CORTEX_M >= 0x03)
|
||||
|
||||
/** \brief Enable FIQ
|
||||
|
||||
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
#define __enable_fault_irq __enable_fiq
|
||||
|
||||
|
||||
/** \brief Disable FIQ
|
||||
|
||||
This function disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
#define __disable_fault_irq __disable_fiq
|
||||
|
||||
|
||||
/** \brief Get Base Priority
|
||||
|
||||
This function returns the current value of the Base Priority register.
|
||||
|
||||
\return Base Priority register value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_BASEPRI(void)
|
||||
{
|
||||
register uint32_t __regBasePri __ASM("basepri");
|
||||
return(__regBasePri);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Base Priority
|
||||
|
||||
This function assigns the given value to the Base Priority register.
|
||||
|
||||
\param [in] basePri Base Priority value to set
|
||||
*/
|
||||
__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
|
||||
{
|
||||
register uint32_t __regBasePri __ASM("basepri");
|
||||
__regBasePri = (basePri & 0xff);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Fault Mask
|
||||
|
||||
This function returns the current value of the Fault Mask register.
|
||||
|
||||
\return Fault Mask register value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_FAULTMASK(void)
|
||||
{
|
||||
register uint32_t __regFaultMask __ASM("faultmask");
|
||||
return(__regFaultMask);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Fault Mask
|
||||
|
||||
This function assigns the given value to the Fault Mask register.
|
||||
|
||||
\param [in] faultMask Fault Mask value to set
|
||||
*/
|
||||
__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
|
||||
{
|
||||
register uint32_t __regFaultMask __ASM("faultmask");
|
||||
__regFaultMask = (faultMask & (uint32_t)1);
|
||||
}
|
||||
|
||||
#endif /* (__CORTEX_M >= 0x03) */
|
||||
|
||||
|
||||
#if (__CORTEX_M == 0x04)
|
||||
|
||||
/** \brief Get FPSCR
|
||||
|
||||
This function returns the current value of the Floating Point Status/Control register.
|
||||
|
||||
\return Floating Point Status/Control register value
|
||||
*/
|
||||
__STATIC_INLINE uint32_t __get_FPSCR(void)
|
||||
{
|
||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||
register uint32_t __regfpscr __ASM("fpscr");
|
||||
return(__regfpscr);
|
||||
#else
|
||||
return(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set FPSCR
|
||||
|
||||
This function assigns the given value to the Floating Point Status/Control register.
|
||||
|
||||
\param [in] fpscr Floating Point Status/Control value to set
|
||||
*/
|
||||
__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
|
||||
{
|
||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||
register uint32_t __regfpscr __ASM("fpscr");
|
||||
__regfpscr = (fpscr);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* (__CORTEX_M == 0x04) */
|
||||
|
||||
|
||||
#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
|
||||
/* IAR iccarm specific functions */
|
||||
|
||||
#include <cmsis_iar.h>
|
||||
|
||||
|
||||
#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
|
||||
/* TI CCS specific functions */
|
||||
|
||||
#include <cmsis_ccs.h>
|
||||
|
||||
|
||||
#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
|
||||
/* GNU gcc specific functions */
|
||||
|
||||
/** \brief Enable IRQ Interrupts
|
||||
|
||||
This function enables IRQ interrupts by clearing the I-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
|
||||
{
|
||||
__ASM volatile ("cpsie i");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Disable IRQ Interrupts
|
||||
|
||||
This function disables IRQ interrupts by setting the I-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
|
||||
{
|
||||
__ASM volatile ("cpsid i");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Control Register
|
||||
|
||||
This function returns the content of the Control Register.
|
||||
|
||||
\return Control Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, control" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Control Register
|
||||
|
||||
This function writes the given value to the Control Register.
|
||||
|
||||
\param [in] control Control Register value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
|
||||
{
|
||||
__ASM volatile ("MSR control, %0" : : "r" (control) );
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get IPSR Register
|
||||
|
||||
This function returns the content of the IPSR Register.
|
||||
|
||||
\return IPSR Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, ipsr" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get APSR Register
|
||||
|
||||
This function returns the content of the APSR Register.
|
||||
|
||||
\return APSR Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, apsr" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get xPSR Register
|
||||
|
||||
This function returns the content of the xPSR Register.
|
||||
|
||||
\return xPSR Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, xpsr" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Process Stack Pointer
|
||||
|
||||
This function returns the current value of the Process Stack Pointer (PSP).
|
||||
|
||||
\return PSP Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
|
||||
{
|
||||
register uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, psp\n" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Process Stack Pointer
|
||||
|
||||
This function assigns the given value to the Process Stack Pointer (PSP).
|
||||
|
||||
\param [in] topOfProcStack Process Stack Pointer value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
|
||||
{
|
||||
__ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) );
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Main Stack Pointer
|
||||
|
||||
This function returns the current value of the Main Stack Pointer (MSP).
|
||||
|
||||
\return MSP Register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
|
||||
{
|
||||
register uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, msp\n" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Main Stack Pointer
|
||||
|
||||
This function assigns the given value to the Main Stack Pointer (MSP).
|
||||
|
||||
\param [in] topOfMainStack Main Stack Pointer value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
|
||||
{
|
||||
__ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) );
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Priority Mask
|
||||
|
||||
This function returns the current state of the priority mask bit from the Priority Mask Register.
|
||||
|
||||
\return Priority Mask value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, primask" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Priority Mask
|
||||
|
||||
This function assigns the given value to the Priority Mask Register.
|
||||
|
||||
\param [in] priMask Priority Mask
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
|
||||
{
|
||||
__ASM volatile ("MSR primask, %0" : : "r" (priMask) );
|
||||
}
|
||||
|
||||
|
||||
#if (__CORTEX_M >= 0x03)
|
||||
|
||||
/** \brief Enable FIQ
|
||||
|
||||
This function enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
|
||||
{
|
||||
__ASM volatile ("cpsie f");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Disable FIQ
|
||||
|
||||
This function disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||
Can only be executed in Privileged modes.
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
|
||||
{
|
||||
__ASM volatile ("cpsid f");
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Base Priority
|
||||
|
||||
This function returns the current value of the Base Priority register.
|
||||
|
||||
\return Base Priority register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Base Priority
|
||||
|
||||
This function assigns the given value to the Base Priority register.
|
||||
|
||||
\param [in] basePri Base Priority value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
|
||||
{
|
||||
__ASM volatile ("MSR basepri, %0" : : "r" (value) );
|
||||
}
|
||||
|
||||
|
||||
/** \brief Get Fault Mask
|
||||
|
||||
This function returns the current value of the Fault Mask register.
|
||||
|
||||
\return Fault Mask register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("MRS %0, faultmask" : "=r" (result) );
|
||||
return(result);
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set Fault Mask
|
||||
|
||||
This function assigns the given value to the Fault Mask register.
|
||||
|
||||
\param [in] faultMask Fault Mask value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
|
||||
{
|
||||
__ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );
|
||||
}
|
||||
|
||||
#endif /* (__CORTEX_M >= 0x03) */
|
||||
|
||||
|
||||
#if (__CORTEX_M == 0x04)
|
||||
|
||||
/** \brief Get FPSCR
|
||||
|
||||
This function returns the current value of the Floating Point Status/Control register.
|
||||
|
||||
\return Floating Point Status/Control register value
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
|
||||
{
|
||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||
uint32_t result;
|
||||
|
||||
__ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
|
||||
return(result);
|
||||
#else
|
||||
return(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/** \brief Set FPSCR
|
||||
|
||||
This function assigns the given value to the Floating Point Status/Control register.
|
||||
|
||||
\param [in] fpscr Floating Point Status/Control value to set
|
||||
*/
|
||||
__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
|
||||
{
|
||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
||||
__ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) );
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* (__CORTEX_M == 0x04) */
|
||||
|
||||
|
||||
#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
|
||||
/* TASKING carm specific functions */
|
||||
|
||||
/*
|
||||
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
||||
* Please use "carm -?i" to get an up to date list of all instrinsics,
|
||||
* Including the CMSIS ones.
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
/*@} end of CMSIS_Core_RegAccFunctions */
|
||||
|
||||
|
||||
#endif /* __CORE_CMFUNC_H */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user