init:全链路闭环控制调通

This commit is contained in:
SkyLi
2026-06-06 21:26:08 +08:00
parent b5be64b642
commit f28d129e11
32 changed files with 5120 additions and 181 deletions
+10
View File
@@ -0,0 +1,10 @@
/libraries/sdk/ti_config/excluded
/project/keil/Listings/
/project/keil/Objects/
uv4.log
uv4.log.lock
keil-assistant.log
CLAUDE.md
+443
View File
@@ -0,0 +1,443 @@
{
"configurations": [
{
"name": "SeekFree_MSPM0G3507_Device_Library",
"includePath": [
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\third_party\\CMSIS\\Core\\Include",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti_config",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_common",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_components",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_device",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_driver",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\user\\inc",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\code",
"E:\\software\\ARM\\ARMCLANG\\include",
"E:\\software\\ARM\\ARMCLANG\\include\\arm_linux",
"E:\\software\\ARM\\ARMCLANG\\include\\arm_linux_compat",
"E:\\software\\ARM\\ARMCLANG\\include\\libcxx",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\user\\src",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti\\driverlib",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti\\driverlib\\m0p\\sysctl"
],
"defines": [
"__MSPM0G3507__",
"__alignof__(x)=",
"__asm(x)=",
"__asm__(x)=",
"__forceinline=",
"__restrict=",
"__volatile__=",
"__inline=",
"__inline__=",
"__declspec(x)=",
"__attribute__(x)=",
"__nonnull__(x)=",
"__unaligned=",
"__promise(x)=",
"__irq=",
"__swi=",
"__weak=",
"__register=",
"__pure=",
"__value_in_regs=",
"__breakpoint(x)=",
"__current_pc()=0U",
"__current_sp()=0U",
"__disable_fiq()=",
"__disable_irq()=",
"__enable_fiq()=",
"__enable_irq()=",
"__force_stores()=",
"__memory_changed()=",
"__schedule_barrier()=",
"__semihost(x,y)=0",
"__vfp_status(x,y)=0",
"__builtin_arm_nop()=",
"__builtin_arm_wfi()=",
"__builtin_arm_wfe()=",
"__builtin_arm_sev()=",
"__builtin_arm_sevl()=",
"__builtin_arm_yield()=",
"__builtin_arm_isb(x)=",
"__builtin_arm_dsb(x)=",
"__builtin_arm_dmb(x)=",
"__builtin_bswap32(x)=0U",
"__builtin_bswap16(x)=0U",
"__builtin_arm_rbit(x)=0U",
"__builtin_clz(x)=0U",
"__builtin_arm_ldrex(x)=0U",
"__builtin_arm_strex(x,y)=0U",
"__builtin_arm_clrex()=",
"__builtin_arm_ssat(x,y)=0U",
"__builtin_arm_usat(x,y)=0U",
"__builtin_arm_ldaex(x)=0U",
"__builtin_arm_stlex(x,y)=0U",
"_ILP32=1",
"_USE_STATIC_INLINE=1",
"__APCS_32__=1",
"__ARMCC_VERSION=6190004",
"__ARMCOMPILER_VERSION=6190004",
"__ARMEL__=1",
"__ARM_32BIT_STATE=1",
"__ARM_ACLE=200",
"__ARM_ARCH=4",
"__ARM_ARCH_4T__=1",
"__ARM_ARCH_ISA_ARM=1",
"__ARM_ARCH_ISA_THUMB=1",
"__ARM_EABI__=1",
"__ARM_FP16_ARGS=1",
"__ARM_FP16_FORMAT_IEEE=1",
"__ARM_NO_IMAGINARY_TYPE=1",
"__ARM_PCS=1",
"__ARM_PROMISE=__builtin_assume",
"__ARM_SIZEOF_MINIMAL_ENUM=4",
"__ARM_SIZEOF_WCHAR_T=4",
"__ARM_TARGET_COPROC=1",
"__ARM_TARGET_COPROC_V4=1",
"__ATOMIC_ACQUIRE=2",
"__ATOMIC_ACQ_REL=4",
"__ATOMIC_CONSUME=1",
"__ATOMIC_RELAXED=0",
"__ATOMIC_RELEASE=3",
"__ATOMIC_SEQ_CST=5",
"__BIGGEST_ALIGNMENT__=8",
"__BITINT_MAXWIDTH__=128",
"__BOOL_WIDTH__=8",
"__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__",
"__CHAR16_TYPE__=unsigned short",
"__CHAR32_TYPE__=unsigned int",
"__CHAR_BIT__=8",
"__CHAR_UNSIGNED__=1",
"__CLANG_ATOMIC_BOOL_LOCK_FREE=1",
"__CLANG_ATOMIC_CHAR16_T_LOCK_FREE=1",
"__CLANG_ATOMIC_CHAR32_T_LOCK_FREE=1",
"__CLANG_ATOMIC_CHAR_LOCK_FREE=1",
"__CLANG_ATOMIC_INT_LOCK_FREE=1",
"__CLANG_ATOMIC_LLONG_LOCK_FREE=1",
"__CLANG_ATOMIC_LONG_LOCK_FREE=1",
"__CLANG_ATOMIC_POINTER_LOCK_FREE=1",
"__CLANG_ATOMIC_SHORT_LOCK_FREE=1",
"__CLANG_ATOMIC_WCHAR_T_LOCK_FREE=1",
"__CONSTANT_CFSTRINGS__=1",
"__DBL_DECIMAL_DIG__=17",
"__DBL_DENORM_MIN__=4.9406564584124654e-324",
"__DBL_DIG__=15",
"__DBL_EPSILON__=2.2204460492503131e-16",
"__DBL_HAS_DENORM__=1",
"__DBL_HAS_INFINITY__=1",
"__DBL_HAS_QUIET_NAN__=1",
"__DBL_MANT_DIG__=53",
"__DBL_MAX_10_EXP__=308",
"__DBL_MAX_EXP__=1024",
"__DBL_MAX__=1.7976931348623157e+308",
"__DBL_MIN_10_EXP__=(-307)",
"__DBL_MIN_EXP__=(-1021)",
"__DBL_MIN__=2.2250738585072014e-308",
"__DECIMAL_DIG__=__LDBL_DECIMAL_DIG__",
"__ELF__=1",
"__ESCAPE__=",
"__FINITE_MATH_ONLY__=1",
"__FLT16_DECIMAL_DIG__=5",
"__FLT16_DENORM_MIN__=5.9604644775390625e-8F16",
"__FLT16_DIG__=3",
"__FLT16_EPSILON__=9.765625e-4F16",
"__FLT16_HAS_DENORM__=1",
"__FLT16_HAS_INFINITY__=1",
"__FLT16_HAS_QUIET_NAN__=1",
"__FLT16_MANT_DIG__=11",
"__FLT16_MAX_10_EXP__=4",
"__FLT16_MAX_EXP__=16",
"__FLT16_MAX__=6.5504e+4F16",
"__FLT16_MIN_10_EXP__=(-4)",
"__FLT16_MIN_EXP__=(-13)",
"__FLT16_MIN__=6.103515625e-5F16",
"__FLT_DECIMAL_DIG__=9",
"__FLT_DENORM_MIN__=1.40129846e-45F",
"__FLT_DIG__=6",
"__FLT_EPSILON__=1.19209290e-7F",
"__FLT_HAS_DENORM__=1",
"__FLT_HAS_INFINITY__=1",
"__FLT_HAS_QUIET_NAN__=1",
"__FLT_MANT_DIG__=24",
"__FLT_MAX_10_EXP__=38",
"__FLT_MAX_EXP__=128",
"__FLT_MAX__=3.40282347e+38F",
"__FLT_MIN_10_EXP__=(-37)",
"__FLT_MIN_EXP__=(-125)",
"__FLT_MIN__=1.17549435e-38F",
"__FLT_RADIX__=2",
"__GCC_ATOMIC_BOOL_LOCK_FREE=1",
"__GCC_ATOMIC_CHAR16_T_LOCK_FREE=1",
"__GCC_ATOMIC_CHAR32_T_LOCK_FREE=1",
"__GCC_ATOMIC_CHAR_LOCK_FREE=1",
"__GCC_ATOMIC_INT_LOCK_FREE=1",
"__GCC_ATOMIC_LLONG_LOCK_FREE=1",
"__GCC_ATOMIC_LONG_LOCK_FREE=1",
"__GCC_ATOMIC_POINTER_LOCK_FREE=1",
"__GCC_ATOMIC_SHORT_LOCK_FREE=1",
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1",
"__GCC_ATOMIC_WCHAR_T_LOCK_FREE=1",
"__GNUC_MINOR__=2",
"__GNUC_PATCHLEVEL__=1",
"__GNUC_STDC_INLINE__=1",
"__GNUC__=4",
"__GXX_ABI_VERSION=1002",
"__ILP32__=1",
"__INT16_C_SUFFIX__=",
"__INT16_FMTd__=\"hd\"",
"__INT16_FMTi__=\"hi\"",
"__INT16_MAX__=32767",
"__INT16_TYPE__=short",
"__INT32_C_SUFFIX__=",
"__INT32_FMTd__=\"d\"",
"__INT32_FMTi__=\"i\"",
"__INT32_MAX__=2147483647",
"__INT32_TYPE__=int",
"__INT64_C_SUFFIX__=LL",
"__INT64_FMTd__=\"lld\"",
"__INT64_FMTi__=\"lli\"",
"__INT64_MAX__=9223372036854775807LL",
"__INT64_TYPE__=long long int",
"__INT8_C_SUFFIX__=",
"__INT8_FMTd__=\"hhd\"",
"__INT8_FMTi__=\"hhi\"",
"__INT8_MAX__=127",
"__INT8_TYPE__=signed char",
"__INTMAX_C_SUFFIX__=LL",
"__INTMAX_FMTd__=\"lld\"",
"__INTMAX_FMTi__=\"lli\"",
"__INTMAX_MAX__=9223372036854775807LL",
"__INTMAX_TYPE__=long long int",
"__INTMAX_WIDTH__=64",
"__INTPTR_FMTd__=\"d\"",
"__INTPTR_FMTi__=\"i\"",
"__INTPTR_MAX__=2147483647",
"__INTPTR_TYPE__=int",
"__INTPTR_WIDTH__=32",
"__INT_FAST16_FMTd__=\"hd\"",
"__INT_FAST16_FMTi__=\"hi\"",
"__INT_FAST16_MAX__=32767",
"__INT_FAST16_TYPE__=short",
"__INT_FAST16_WIDTH__=16",
"__INT_FAST32_FMTd__=\"d\"",
"__INT_FAST32_FMTi__=\"i\"",
"__INT_FAST32_MAX__=2147483647",
"__INT_FAST32_TYPE__=int",
"__INT_FAST32_WIDTH__=32",
"__INT_FAST64_FMTd__=\"lld\"",
"__INT_FAST64_FMTi__=\"lli\"",
"__INT_FAST64_MAX__=9223372036854775807LL",
"__INT_FAST64_TYPE__=long long int",
"__INT_FAST64_WIDTH__=64",
"__INT_FAST8_FMTd__=\"hhd\"",
"__INT_FAST8_FMTi__=\"hhi\"",
"__INT_FAST8_MAX__=127",
"__INT_FAST8_TYPE__=signed char",
"__INT_FAST8_WIDTH__=8",
"__INT_LEAST16_FMTd__=\"hd\"",
"__INT_LEAST16_FMTi__=\"hi\"",
"__INT_LEAST16_MAX__=32767",
"__INT_LEAST16_TYPE__=short",
"__INT_LEAST16_WIDTH__=16",
"__INT_LEAST32_FMTd__=\"d\"",
"__INT_LEAST32_FMTi__=\"i\"",
"__INT_LEAST32_MAX__=2147483647",
"__INT_LEAST32_TYPE__=int",
"__INT_LEAST32_WIDTH__=32",
"__INT_LEAST64_FMTd__=\"lld\"",
"__INT_LEAST64_FMTi__=\"lli\"",
"__INT_LEAST64_MAX__=9223372036854775807LL",
"__INT_LEAST64_TYPE__=long long int",
"__INT_LEAST64_WIDTH__=64",
"__INT_LEAST8_FMTd__=\"hhd\"",
"__INT_LEAST8_FMTi__=\"hhi\"",
"__INT_LEAST8_MAX__=127",
"__INT_LEAST8_TYPE__=signed char",
"__INT_LEAST8_WIDTH__=8",
"__INT_MAX__=2147483647",
"__INT_WIDTH__=32",
"__I__=1.0if",
"__LDBL_DECIMAL_DIG__=17",
"__LDBL_DENORM_MIN__=4.9406564584124654e-324L",
"__LDBL_DIG__=15",
"__LDBL_EPSILON__=2.2204460492503131e-16L",
"__LDBL_HAS_DENORM__=1",
"__LDBL_HAS_INFINITY__=1",
"__LDBL_HAS_QUIET_NAN__=1",
"__LDBL_MANT_DIG__=53",
"__LDBL_MAX_10_EXP__=308",
"__LDBL_MAX_EXP__=1024",
"__LDBL_MAX__=1.7976931348623157e+308L",
"__LDBL_MIN_10_EXP__=(-307)",
"__LDBL_MIN_EXP__=(-1021)",
"__LDBL_MIN__=2.2250738585072014e-308L",
"__LITTLE_ENDIAN__=1",
"__LLONG_WIDTH__=64",
"__LONG_LONG_MAX__=9223372036854775807LL",
"__LONG_MAX__=2147483647L",
"__LONG_WIDTH__=32",
"__NO_INLINE__=1",
"__OBJC_BOOL_IS_BOOL=0",
"__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES=3",
"__OPENCL_MEMORY_SCOPE_DEVICE=2",
"__OPENCL_MEMORY_SCOPE_SUB_GROUP=4",
"__OPENCL_MEMORY_SCOPE_WORK_GROUP=1",
"__OPENCL_MEMORY_SCOPE_WORK_ITEM=0",
"__ORDER_BIG_ENDIAN__=4321",
"__ORDER_LITTLE_ENDIAN__=1234",
"__ORDER_PDP_ENDIAN__=3412",
"__POINTER_WIDTH__=32",
"__PRAGMA_REDEFINE_EXTNAME=1",
"__PTRDIFF_FMTd__=\"d\"",
"__PTRDIFF_FMTi__=\"i\"",
"__PTRDIFF_MAX__=2147483647",
"__PTRDIFF_TYPE__=int",
"__PTRDIFF_WIDTH__=32",
"__REGISTER_PREFIX__=",
"__SCHAR_MAX__=127",
"__SHRT_MAX__=32767",
"__SHRT_WIDTH__=16",
"__SIG_ATOMIC_MAX__=2147483647",
"__SIG_ATOMIC_WIDTH__=32",
"__SIZEOF_DOUBLE__=8",
"__SIZEOF_FLOAT__=4",
"__SIZEOF_INT__=4",
"__SIZEOF_LONG_DOUBLE__=8",
"__SIZEOF_LONG_LONG__=8",
"__SIZEOF_LONG__=4",
"__SIZEOF_POINTER__=4",
"__SIZEOF_PTRDIFF_T__=4",
"__SIZEOF_SHORT__=2",
"__SIZEOF_SIZE_T__=4",
"__SIZEOF_WCHAR_T__=4",
"__SIZEOF_WINT_T__=4",
"__SIZE_FMTX__=\"X\"",
"__SIZE_FMTo__=\"o\"",
"__SIZE_FMTu__=\"u\"",
"__SIZE_FMTx__=\"x\"",
"__SIZE_MAX__=4294967295U",
"__SIZE_TYPE__=unsigned int",
"__SIZE_WIDTH__=32",
"__STDC_HOSTED__=1",
"__STDC_UTF_16__=1",
"__STDC_UTF_32__=1",
"__STDC_VERSION__=201710L",
"__STDC__=1",
"__UINT16_C_SUFFIX__=",
"__UINT16_FMTX__=\"hX\"",
"__UINT16_FMTo__=\"ho\"",
"__UINT16_FMTu__=\"hu\"",
"__UINT16_FMTx__=\"hx\"",
"__UINT16_MAX__=65535",
"__UINT16_TYPE__=unsigned short",
"__UINT32_C_SUFFIX__=U",
"__UINT32_FMTX__=\"X\"",
"__UINT32_FMTo__=\"o\"",
"__UINT32_FMTu__=\"u\"",
"__UINT32_FMTx__=\"x\"",
"__UINT32_MAX__=4294967295U",
"__UINT32_TYPE__=unsigned int",
"__UINT64_C_SUFFIX__=ULL",
"__UINT64_FMTX__=\"llX\"",
"__UINT64_FMTo__=\"llo\"",
"__UINT64_FMTu__=\"llu\"",
"__UINT64_FMTx__=\"llx\"",
"__UINT64_MAX__=18446744073709551615ULL",
"__UINT64_TYPE__=long long unsigned int",
"__UINT8_C_SUFFIX__=",
"__UINT8_FMTX__=\"hhX\"",
"__UINT8_FMTo__=\"hho\"",
"__UINT8_FMTu__=\"hhu\"",
"__UINT8_FMTx__=\"hhx\"",
"__UINT8_MAX__=255",
"__UINT8_TYPE__=unsigned char",
"__UINTMAX_C_SUFFIX__=ULL",
"__UINTMAX_FMTX__=\"llX\"",
"__UINTMAX_FMTo__=\"llo\"",
"__UINTMAX_FMTu__=\"llu\"",
"__UINTMAX_FMTx__=\"llx\"",
"__UINTMAX_MAX__=18446744073709551615ULL",
"__UINTMAX_TYPE__=long long unsigned int",
"__UINTMAX_WIDTH__=64",
"__UINTPTR_FMTX__=\"X\"",
"__UINTPTR_FMTo__=\"o\"",
"__UINTPTR_FMTu__=\"u\"",
"__UINTPTR_FMTx__=\"x\"",
"__UINTPTR_MAX__=4294967295U",
"__UINTPTR_TYPE__=unsigned int",
"__UINTPTR_WIDTH__=32",
"__UINT_FAST16_FMTX__=\"hX\"",
"__UINT_FAST16_FMTo__=\"ho\"",
"__UINT_FAST16_FMTu__=\"hu\"",
"__UINT_FAST16_FMTx__=\"hx\"",
"__UINT_FAST16_MAX__=65535",
"__UINT_FAST16_TYPE__=unsigned short",
"__UINT_FAST32_FMTX__=\"X\"",
"__UINT_FAST32_FMTo__=\"o\"",
"__UINT_FAST32_FMTu__=\"u\"",
"__UINT_FAST32_FMTx__=\"x\"",
"__UINT_FAST32_MAX__=4294967295U",
"__UINT_FAST32_TYPE__=unsigned int",
"__UINT_FAST64_FMTX__=\"llX\"",
"__UINT_FAST64_FMTo__=\"llo\"",
"__UINT_FAST64_FMTu__=\"llu\"",
"__UINT_FAST64_FMTx__=\"llx\"",
"__UINT_FAST64_MAX__=18446744073709551615ULL",
"__UINT_FAST64_TYPE__=long long unsigned int",
"__UINT_FAST8_FMTX__=\"hhX\"",
"__UINT_FAST8_FMTo__=\"hho\"",
"__UINT_FAST8_FMTu__=\"hhu\"",
"__UINT_FAST8_FMTx__=\"hhx\"",
"__UINT_FAST8_MAX__=255",
"__UINT_FAST8_TYPE__=unsigned char",
"__UINT_LEAST16_FMTX__=\"hX\"",
"__UINT_LEAST16_FMTo__=\"ho\"",
"__UINT_LEAST16_FMTu__=\"hu\"",
"__UINT_LEAST16_FMTx__=\"hx\"",
"__UINT_LEAST16_MAX__=65535",
"__UINT_LEAST16_TYPE__=unsigned short",
"__UINT_LEAST32_FMTX__=\"X\"",
"__UINT_LEAST32_FMTo__=\"o\"",
"__UINT_LEAST32_FMTu__=\"u\"",
"__UINT_LEAST32_FMTx__=\"x\"",
"__UINT_LEAST32_MAX__=4294967295U",
"__UINT_LEAST32_TYPE__=unsigned int",
"__UINT_LEAST64_FMTX__=\"llX\"",
"__UINT_LEAST64_FMTo__=\"llo\"",
"__UINT_LEAST64_FMTu__=\"llu\"",
"__UINT_LEAST64_FMTx__=\"llx\"",
"__UINT_LEAST64_MAX__=18446744073709551615ULL",
"__UINT_LEAST64_TYPE__=long long unsigned int",
"__UINT_LEAST8_FMTX__=\"hhX\"",
"__UINT_LEAST8_FMTo__=\"hho\"",
"__UINT_LEAST8_FMTu__=\"hhu\"",
"__UINT_LEAST8_FMTx__=\"hhx\"",
"__UINT_LEAST8_MAX__=255",
"__UINT_LEAST8_TYPE__=unsigned char",
"__USER_LABEL_PREFIX__=",
"__VERSION__=\"Clang 16.0.0\"",
"__VFP_FP__=1",
"__WCHAR_MAX__=4294967295U",
"__WCHAR_TYPE__=unsigned int",
"__WCHAR_UNSIGNED__=1",
"__WCHAR_WIDTH__=32",
"__WINT_MAX__=2147483647",
"__WINT_TYPE__=int",
"__WINT_WIDTH__=32",
"__arm=1",
"__arm__=1",
"__clang__=1",
"__clang_literal_encoding__=\"UTF-8\"",
"__clang_major__=16",
"__clang_minor__=0",
"__clang_patchlevel__=0",
"__clang_version__=\"16.0.0 \"",
"__clang_wide_literal_encoding__=\"UTF-32\"",
"__llvm__=1"
],
"intelliSenseMode": "${default}"
}
],
"version": 4
}
+4
View File
@@ -0,0 +1,4 @@
{
"C_Cpp.errorSquiggles": "disabled",
"C_Cpp.default.compilerPath": ""
}
@@ -5,16 +5,25 @@
* @v2CliArgs --device "MSPM0G3507" --package "LQFP-64(PM)" --product "mspm0_sdk@2.04.00.06" * @v2CliArgs --device "MSPM0G3507" --package "LQFP-64(PM)" --product "mspm0_sdk@2.04.00.06"
* @versions {"tool":"1.23.1+4034"} * @versions {"tool":"1.23.1+4034"}
*/ */
scripting.excludeFromBuild("device_linker.cmd");
scripting.excludeFromBuild("device_linker.lds");
scripting.excludeFromBuild("device.opt");
scripting.excludeFromBuild("device.cmd.genlibs");
scripting.excludeFromBuild("device.lds.genlibs");
scripting.excludeFromBuild("Event.dot");
/** /**
* Import the modules used in this configuration. * Import the modules used in this configuration.
*/ */
const GPIO = scripting.addModule("/ti/driverlib/GPIO", {}, false); const GPIO = scripting.addModule("/ti/driverlib/GPIO", {}, false);
const GPIO1 = GPIO.addInstance(); const GPIO1 = GPIO.addInstance();
const GPIO2 = GPIO.addInstance(); const GPIO2 = GPIO.addInstance();
const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL"); const QEI = scripting.addModule("/ti/driverlib/QEI", {}, false);
const SYSTICK = scripting.addModule("/ti/driverlib/SYSTICK"); const QEI1 = QEI.addInstance();
const VREF = scripting.addModule("/ti/driverlib/VREF"); const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL");
const SYSTICK = scripting.addModule("/ti/driverlib/SYSTICK");
const VREF = scripting.addModule("/ti/driverlib/VREF");
const ProjectConfig = scripting.addModule("/ti/project_config/ProjectConfig");
/** /**
* Write custom configuration values to the imported modules. * Write custom configuration values to the imported modules.
@@ -79,6 +88,13 @@ GPIO2.associatedPins[0].interruptEn = true;
GPIO2.associatedPins[0].polarity = "RISE"; GPIO2.associatedPins[0].polarity = "RISE";
GPIO2.associatedPins[0].pin.$assign = "PA18"; GPIO2.associatedPins[0].pin.$assign = "PA18";
QEI1.$name = "QEI_0";
QEI1.peripheral.$assign = "TIMG8";
QEI1.peripheral.ccp0Pin.$assign = "PB6";
QEI1.peripheral.ccp1Pin.$assign = "PB7";
QEI1.ccp0PinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric0";
QEI1.ccp1PinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric1";
SYSCTL.forceDefaultClkConfig = true; SYSCTL.forceDefaultClkConfig = true;
SYSCTL.clockTreeEn = true; SYSCTL.clockTreeEn = true;
scripting.suppress("For best practices when the CPUCLK is running at 32MHz and above, clear the flash status bit using DL_FlashCTL_executeClearStatus\\(\\) before executing any flash operation\\. Otherwise there may be false positives\\.", SYSCTL); scripting.suppress("For best practices when the CPUCLK is running at 32MHz and above, clear the flash status bit using DL_FlashCTL_executeClearStatus\\(\\) before executing any flash operation\\. Otherwise there may be false positives\\.", SYSCTL);
@@ -98,6 +114,8 @@ VREF.peripheral.vrefPosPin.$assign = "PA23";
VREF.peripheral.vrefNegPin.$assign = "PA21"; VREF.peripheral.vrefNegPin.$assign = "PA21";
VREF.vrefNegPinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric30"; VREF.vrefNegPinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric30";
ProjectConfig.genLibIQVersion = "MATHACL";
/** /**
* Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
* version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to
+54 -122
View File
@@ -40,6 +40,8 @@
#include "ti_msp_dl_config.h" #include "ti_msp_dl_config.h"
DL_TimerG_backupConfig gQEI_0Backup;
/* /*
* ======== SYSCFG_DL_init ======== * ======== SYSCFG_DL_init ========
* Perform any initialization needed before using any board APIs * Perform any initialization needed before using any board APIs
@@ -50,19 +52,47 @@ SYSCONFIG_WEAK void SYSCFG_DL_init(void)
SYSCFG_DL_GPIO_init(); SYSCFG_DL_GPIO_init();
/* Module-Specific Initializations*/ /* Module-Specific Initializations*/
SYSCFG_DL_SYSCTL_init(); SYSCFG_DL_SYSCTL_init();
SYSCFG_DL_QEI_0_init();
SYSCFG_DL_VREF_init(); SYSCFG_DL_VREF_init();
SYSCFG_DL_SYSTICK_init(); SYSCFG_DL_SYSTICK_init();
/* Ensure backup structures have no valid state */
gQEI_0Backup.backupRdy = false;
}
/*
* User should take care to save and restore register configuration in application.
* See Retention Configuration section for more details.
*/
SYSCONFIG_WEAK bool SYSCFG_DL_saveConfiguration(void)
{
bool retStatus = true;
retStatus &= DL_TimerG_saveConfiguration(QEI_0_INST, &gQEI_0Backup);
return retStatus;
}
SYSCONFIG_WEAK bool SYSCFG_DL_restoreConfiguration(void)
{
bool retStatus = true;
retStatus &= DL_TimerG_restoreConfiguration(QEI_0_INST, &gQEI_0Backup, false);
return retStatus;
} }
SYSCONFIG_WEAK void SYSCFG_DL_initPower(void) SYSCONFIG_WEAK void SYSCFG_DL_initPower(void)
{ {
DL_GPIO_reset(GPIOA); DL_GPIO_reset(GPIOA);
DL_GPIO_reset(GPIOB); DL_GPIO_reset(GPIOB);
DL_TimerG_reset(QEI_0_INST);
DL_VREF_reset(VREF); DL_VREF_reset(VREF);
DL_GPIO_enablePower(GPIOA); DL_GPIO_enablePower(GPIOA);
DL_GPIO_enablePower(GPIOB); DL_GPIO_enablePower(GPIOB);
DL_TimerG_enablePower(QEI_0_INST);
DL_VREF_enablePower(VREF); DL_VREF_enablePower(VREF);
delay_cycles(POWER_STARTUP_DELAY); delay_cycles(POWER_STARTUP_DELAY);
@@ -76,6 +106,9 @@ SYSCONFIG_WEAK void SYSCFG_DL_GPIO_init(void)
DL_GPIO_initPeripheralAnalogFunction(GPIO_LFXIN_IOMUX); DL_GPIO_initPeripheralAnalogFunction(GPIO_LFXIN_IOMUX);
DL_GPIO_initPeripheralAnalogFunction(GPIO_LFXOUT_IOMUX); DL_GPIO_initPeripheralAnalogFunction(GPIO_LFXOUT_IOMUX);
DL_GPIO_initPeripheralInputFunction(GPIO_QEI_0_PHA_IOMUX,GPIO_QEI_0_PHA_IOMUX_FUNC);
DL_GPIO_initPeripheralInputFunction(GPIO_QEI_0_PHB_IOMUX,GPIO_QEI_0_PHB_IOMUX_FUNC);
DL_GPIO_initDigitalOutputFeatures(LED_A14_PIN_14_IOMUX, DL_GPIO_initDigitalOutputFeatures(LED_A14_PIN_14_IOMUX,
DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_DOWN, DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_DOWN,
DL_GPIO_DRIVE_STRENGTH_LOW, DL_GPIO_HIZ_DISABLE); DL_GPIO_DRIVE_STRENGTH_LOW, DL_GPIO_HIZ_DISABLE);
@@ -111,128 +144,6 @@ static const DL_SYSCTL_LFCLKConfig gLFCLKConfig = {
.monitor = false, .monitor = false,
.xt1Drive = DL_SYSCTL_LFXT_DRIVE_STRENGTH_HIGHEST, .xt1Drive = DL_SYSCTL_LFXT_DRIVE_STRENGTH_HIGHEST,
}; };
///////////////////////////////////////////////////////////////
void DL_SYSCTL_setHFCLKSourceHFXTParams (DL_SYSCTL_HFXT_RANGE range, uint32_t startupTime, bool monitorEnable)
{
uint32_t register_temp = SYSCTL->SOCLOCK.HFCLKCLKCFG;
register_temp &= ~(SYSCTL_HFCLKCLKCFG_HFXTRSEL_MASK | SYSCTL_HFCLKCLKCFG_HFCLKFLTCHK_MASK);
switch(range)
{
case DL_SYSCTL_HFXT_RANGE_4_8_MHZ : register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE4TO8); break;
case DL_SYSCTL_HFXT_RANGE_8_16_MHZ : register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE8TO16); break;
case DL_SYSCTL_HFXT_RANGE_16_32_MHZ: register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE16TO32); break;
case DL_SYSCTL_HFXT_RANGE_32_48_MHZ: register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE32TO48); break;
}
register_temp |= (monitorEnable) ? (SYSCTL_HFCLKCLKCFG_HFCLKFLTCHK_ENABLE) : (SYSCTL_HFCLKCLKCFG_HFCLKFLTCHK_DISABLE);
SYSCTL->SOCLOCK.HFCLKCLKCFG = register_temp;
SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKEN_HFXTEN_ENABLE; // 必须启动 否则频率不准
SYSCTL->SOCLOCK.HSCLKEN = SYSCTL_HSCLKEN_SYSPLLEN_ENABLE | SYSCTL_HSCLKEN_USEEXTHFCLK_ENABLE;
SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKCFG_HSCLKSEL_HFCLKCLK;
}
void DL_SYSCTL_configSYSPLL (const DL_SYSCTL_SYSPLLConfig *config)
{
uint32_t register_temp = 0;
SYSCTL->SOCLOCK.HSCLKEN &= ~(SYSCTL_HSCLKEN_SYSPLLEN_MASK);
{
register_temp = SYSCTL->SOCLOCK.SYSPLLCFG0;
register_temp &= ~(SYSCTL_SYSPLLCFG0_SYSPLLREF_MASK | SYSCTL_SYSPLLCFG0_MCLK2XVCO_MASK
| SYSCTL_SYSPLLCFG0_ENABLECLK0_MASK | SYSCTL_SYSPLLCFG0_ENABLECLK1_MASK | SYSCTL_SYSPLLCFG0_ENABLECLK2X_MASK
| SYSCTL_SYSPLLCFG0_RDIVCLK0_MASK | SYSCTL_SYSPLLCFG0_RDIVCLK1_MASK | SYSCTL_SYSPLLCFG0_RDIVCLK2X_MASK );
register_temp |= config->rDivClk2x ;
register_temp |= config->rDivClk1 ;
register_temp |= config->rDivClk0 ;
register_temp |= config->enableCLK2x ;
register_temp |= config->enableCLK1 ;
register_temp |= config->enableCLK0 ;
register_temp |= config->sysPLLMCLK ;
register_temp |= config->sysPLLRef ;
SYSCTL->SOCLOCK.SYSPLLCFG0 = register_temp;
}
{
register_temp = SYSCTL->SOCLOCK.SYSPLLCFG1;
register_temp &= ~(SYSCTL_SYSPLLCFG1_PDIV_MASK | SYSCTL_SYSPLLCFG1_QDIV_MASK);
register_temp |= (config->qDiv << SYSCTL_SYSPLLCFG1_QDIV_OFS );
register_temp |= (config->pDiv);
SYSCTL->SOCLOCK.SYSPLLCFG1 = register_temp;
}
{
SYSCTL->SOCLOCK.SYSPLLPARAM0 =
*(volatile uint32_t *) ((uint32_t) config->inputFreq);
SYSCTL->SOCLOCK.SYSPLLPARAM1 =
*(volatile uint32_t *) ((uint32_t) config->inputFreq + (uint32_t) 0x4);
}
SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKEN_SYSPLLEN_ENABLE;
while ((DL_SYSCTL_getClockStatus() & SYSCTL_CLKSTATUS_SYSPLLGOOD_MASK) !=
DL_SYSCTL_CLK_STATUS_SYSPLL_GOOD) {
;
}
}
void DL_SYSCTL_setLFCLKSourceLFXT (const DL_SYSCTL_LFCLKConfig *config)
{
uint32_t register_temp = SYSCTL->SOCLOCK.LFCLKCFG;
register_temp &= ~(SYSCTL_LFCLKCFG_XT1DRIVE_MASK | SYSCTL_LFCLKCFG_MONITOR_MASK | SYSCTL_LFCLKCFG_LOWCAP_MASK);
register_temp |= (config->lowCap) ? (SYSCTL_LFCLKCFG_LOWCAP_ENABLE) : (SYSCTL_LFCLKCFG_LOWCAP_DISABLE);
register_temp |= (config->monitor) ? (SYSCTL_LFCLKCFG_MONITOR_ENABLE) : (SYSCTL_LFCLKCFG_MONITOR_DISABLE);
register_temp |= (config->xt1Drive);
SYSCTL->SOCLOCK.LFCLKCFG = register_temp;
}
void DL_SYSCTL_switchMCLKfromSYSOSCtoHSCLK (DL_SYSCTL_HSCLK_SOURCE source)
{
SYSCTL->SOCLOCK.HSCLKCFG = (uint32_t) source;
SYSCTL->SOCLOCK.MCLKCFG |= SYSCTL_MCLKCFG_USEHSCLK_ENABLE;
}
////////////////////////////////////////////////////////////////////////////
SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void) SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void)
{ {
@@ -258,6 +169,27 @@ SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void)
} }
static const DL_TimerG_ClockConfig gQEI_0ClockConfig = {
.clockSel = DL_TIMER_CLOCK_BUSCLK,
.divideRatio = DL_TIMER_CLOCK_DIVIDE_1,
.prescale = 0U
};
SYSCONFIG_WEAK void SYSCFG_DL_QEI_0_init(void) {
DL_TimerG_setClockConfig(
QEI_0_INST, (DL_TimerG_ClockConfig *) &gQEI_0ClockConfig);
DL_TimerG_configQEI(QEI_0_INST, DL_TIMER_QEI_MODE_2_INPUT,
DL_TIMER_CC_INPUT_INV_NOINVERT, DL_TIMER_CC_0_INDEX);
DL_TimerG_configQEI(QEI_0_INST, DL_TIMER_QEI_MODE_2_INPUT,
DL_TIMER_CC_INPUT_INV_NOINVERT, DL_TIMER_CC_1_INDEX);
DL_TimerG_setLoadValue(QEI_0_INST, 65535);
DL_TimerG_enableClock(QEI_0_INST);
}
static const DL_VREF_Config gVREFConfig = { static const DL_VREF_Config gVREFConfig = {
.vrefEnable = DL_VREF_ENABLE_DISABLE, .vrefEnable = DL_VREF_ENABLE_DISABLE,
@@ -87,6 +87,23 @@ extern "C" {
/* Defines for QEI_0 */
#define QEI_0_INST TIMG8
#define QEI_0_INST_IRQHandler TIMG8_IRQHandler
#define QEI_0_INST_INT_IRQN (TIMG8_INT_IRQn)
/* Pin configuration defines for QEI_0 PHA Pin */
#define GPIO_QEI_0_PHA_PORT GPIOB
#define GPIO_QEI_0_PHA_PIN DL_GPIO_PIN_6
#define GPIO_QEI_0_PHA_IOMUX (IOMUX_PINCM23)
#define GPIO_QEI_0_PHA_IOMUX_FUNC IOMUX_PINCM23_PF_TIMG8_CCP0
/* Pin configuration defines for QEI_0 PHB Pin */
#define GPIO_QEI_0_PHB_PORT GPIOB
#define GPIO_QEI_0_PHB_PIN DL_GPIO_PIN_7
#define GPIO_QEI_0_PHB_IOMUX (IOMUX_PINCM24)
#define GPIO_QEI_0_PHB_IOMUX_FUNC IOMUX_PINCM24_PF_TIMG8_CCP1
/* Defines for VREF */ /* Defines for VREF */
#define VREF_VOLTAGE_MV 3300 #define VREF_VOLTAGE_MV 3300
#define GPIO_VREF_VREFPOS_PORT GPIOA #define GPIO_VREF_VREFPOS_PORT GPIOA
@@ -126,10 +143,13 @@ void SYSCFG_DL_init(void);
void SYSCFG_DL_initPower(void); void SYSCFG_DL_initPower(void);
void SYSCFG_DL_GPIO_init(void); void SYSCFG_DL_GPIO_init(void);
void SYSCFG_DL_SYSCTL_init(void); void SYSCFG_DL_SYSCTL_init(void);
void SYSCFG_DL_QEI_0_init(void);
void SYSCFG_DL_VREF_init(void); void SYSCFG_DL_VREF_init(void);
void SYSCFG_DL_SYSTICK_init(void); void SYSCFG_DL_SYSTICK_init(void);
bool SYSCFG_DL_saveConfiguration(void);
bool SYSCFG_DL_restoreConfiguration(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
+33
View File
@@ -0,0 +1,33 @@
#include "Beep.h"
#include "zf_driver_gpio.h"
static int beep_time=0;
static int beep_T;
void beep_init(int t){
//gpio_init(P33_10, GPO, 0, GPO_PUSH_PULL); // 蜂鸣器初始化
gpio_init(A14, GPO, 0, GPO_PUSH_PULL);
beep_T=t;
}
void beep_on(void){
// pwm_set_duty(ATOM2_CH0_P33_10,5000);
//gpio_set_level(P33_10,1);
gpio_set_level(A14,1);
}
void beep_off(void){
// pwm_set_duty(ATOM2_CH0_P33_10,0);
//gpio_set_level(P33_10,0);
gpio_set_level(A14,0);
}
void beep_on_time(int ms){
beep_time=ms/beep_T;
}
void beep_actuator(void){
if(beep_time>0){
beep_on();
beep_time--;
}
else{
beep_off();
}
}
+12
View File
@@ -0,0 +1,12 @@
#ifndef __BEEP_H
#define __BEEP_H
//初始化,参数为周期单位ms
void beep_init(int t);
void beep_on(void);
void beep_off(void);
//蜂鸣器鸣叫指定时间,参数为时间单位ms
void beep_on_time(int ms);
void beep_actuator(void);
#endif
+66
View File
@@ -0,0 +1,66 @@
#include "Command.h"
#include "zf_driver_uart.h"
#include "zf_common_interrupt.h"
#include "ti/driverlib/dl_uart_main.h"
#include "zf_common_fifo.h"
volatile fifo_struct command_fifo = {0};
volatile uint8_t command_fifo_buffer[COMMAND_FIFO_BUFFER_SIZE] = {0};
uint8_t command_sum(uint8_t* data,int len);
void command_callback(uint32 state, void *ptr)
{
while(false == DL_UART_isRXFIFOEmpty(UART2))//读取到一个数据
{
fifo_write_element((fifo_struct*)&command_fifo,DL_UART_Main_receiveData(UART2));//写入软件FIFO
}
}
void command_init()
{
uart_init(UART_2,115200,UART2_TX_B15,UART2_RX_B16);
uart_set_interrupt_config(UART_2,UART_INTERRUPT_CONFIG_RX_ENABLE);
interrupt_set_priority(UART2_INT_IRQn,1);//设置为与主要任务平行的优先级
//开启发送DMA
//开启硬件FIFO
DL_UART_Main_enableFIFOs(UART2);
DL_UART_Main_setRXFIFOThreshold(UART2,DL_UART_MAIN_RX_FIFO_LEVEL_1_2_FULL);
//设置软件FIFO
fifo_init((fifo_struct *)&command_fifo,FIFO_DATA_8BIT,(void*)command_fifo_buffer,COMMAND_FIFO_BUFFER_SIZE);
//设置中断回调
uart_set_callback(UART_2,command_callback,NULL);
}
//从软件FIFO中解析数据包并执行
void command_task()
{
}
//DMA发送使用的地址
uint8_t angle_velocity_data[6] = {0};
//发送速度前馈
void command_send_angle_velocity(float* pointer_angle_velocity)
{
//等待上一次DMA发送完成
//填充数据
uint8_t* p = (uint8_t*)pointer_angle_velocity;
angle_velocity_data[0]=0xA1;
angle_velocity_data[1]=*(p++);
angle_velocity_data[2]=*(p++);
angle_velocity_data[3]=*(p++);
angle_velocity_data[4]=*(p++);
angle_velocity_data[5]=command_sum(angle_velocity_data,5);
//DMA发送(非阻塞)
}
uint8_t command_sum(uint8_t* data,int len)
{
uint8_t sum = 0;
for(int i=0;i<len;i++)
{
sum+=data[i];
}
return sum;
}
+12
View File
@@ -0,0 +1,12 @@
#ifndef __COMMAND_H
#define __COMMAND_H
#define COMMAND_FIFO_BUFFER_SIZE 16
#include "zf_common_typedef.h"
void command_init();
void command_task();
void command_send_angle_velocity(float* pointer_angle_velocity);
#endif
+122
View File
@@ -0,0 +1,122 @@
#include "GrayscaleSensor.h"
#include "zf_driver_adc.h"
#include "zf_driver_gpio.h"
#include "zf_driver_delay.h"
#define AD2 B8
#define AD1 B9
#define AD0 B14
#define FILTER_ALPHA 0.5f //位置滤波系数,范围 [0, 1],值越大响应越快但噪声越大
volatile static uint16 adc_white[8] = {4096,4096,4096,4096,4096,4096,4096,4096}; // 存储8路灰度传感器的白色参考值,初始值为满量程
volatile static uint16 adc_black[8] = {0,0,0,0,0,0,0,0}; // 存储8路灰度传感器的黑色参考值,初始值为0
volatile static uint16 adc_range[8] = {4096,4096,4096,4096,4096,4096,4096,4096}; // 存储8路灰度传感器的动态范围,初始值为满量程
volatile static uint16 adc_raw_value[8] = {0}; // 存储8路灰度传感器的原始 ADC 值
static float adc_normalized[8] = {0}; // 存储8路灰度传感器的归一化值,范围 [0, 1]
static float adc_normalized_sum = 0; // 归一化值的总和,用于计算位置
volatile float grayscale_sensor_position_prev = 0; // 存储小车相对于黑线的位置
volatile float grayscale_sensor_position = 0; // 存储小车相对于黑线的位置
static const int position[8] = {-4, -3, -2, -1, 1, 2, 3, 4}; // 每个传感器对应的位置
void grayscale_sensor_set_white(void)
{
for(uint8 i=0;i<8;i++)
{
adc_white[i] = adc_raw_value[i];
adc_range[i] = adc_white[i] - adc_black[i];
}
}
void grayscale_sensor_set_black(void)
{
for(uint8 i=0;i<8;i++)
{
adc_black[i] = adc_raw_value[i];
adc_range[i] = adc_white[i] - adc_black[i];
}
}
void grayscale_sensor_init(void)
{
adc_init(ADC1_CH5_B18, ADC_12BIT);
gpio_init(AD2, GPO, GPIO_LOW, GPO_PUSH_PULL);
gpio_init(AD1, GPO, GPIO_LOW, GPO_PUSH_PULL);
gpio_init(AD0, GPO, GPIO_LOW, GPO_PUSH_PULL);
gpio_set_level(AD2, 1);
gpio_set_level(AD1, 1);
gpio_set_level(AD0, 1);
}
/*真值表
AD2 AD1 AD0
0 0 0 CH1
0 0 1 CH2
0 1 0 CH3
0 1 1 CH4
1 0 0 CH5
1 0 1 CH6
1 1 0 CH7
1 1 1 CH8
*/
void grayscale_sensor_scan(void)
{
gpio_set_level(AD2, 0);
gpio_set_level(AD1, 0);
gpio_set_level(AD0, 0); // CH1
system_delay_us(1);
adc_raw_value[0]=adc_mean_filter_convert(ADC1_CH5_B18, 15);
gpio_set_level(AD2, 0);
gpio_set_level(AD1, 0);
gpio_set_level(AD0, 1); // CH2
system_delay_us(1);
adc_raw_value[1]=adc_mean_filter_convert(ADC1_CH5_B18, 15);
gpio_set_level(AD2, 0);
gpio_set_level(AD1, 1);
gpio_set_level(AD0, 0); // CH3
system_delay_us(1);
adc_raw_value[2]=adc_mean_filter_convert(ADC1_CH5_B18, 15);
gpio_set_level(AD2, 0);
gpio_set_level(AD1, 1);
gpio_set_level(AD0, 1); // CH4
system_delay_us(1);
adc_raw_value[3]=adc_mean_filter_convert(ADC1_CH5_B18, 15);
gpio_set_level(AD2, 1);
gpio_set_level(AD1, 0);
gpio_set_level(AD0, 0); // CH5
system_delay_us(1);
adc_raw_value[4]=adc_mean_filter_convert(ADC1_CH5_B18, 15);
gpio_set_level(AD2, 1);
gpio_set_level(AD1, 0);
gpio_set_level(AD0, 1); // CH6
system_delay_us(1);
adc_raw_value[5]=adc_mean_filter_convert(ADC1_CH5_B18, 15);
gpio_set_level(AD2, 1);
gpio_set_level(AD1, 1);
gpio_set_level(AD0, 0); // CH7
system_delay_us(1);
adc_raw_value[6]=adc_mean_filter_convert(ADC1_CH5_B18, 15);
gpio_set_level(AD2, 1);
gpio_set_level(AD1, 1);
gpio_set_level(AD0, 1); // CH8
system_delay_us(1);
adc_raw_value[7]=adc_mean_filter_convert(ADC1_CH5_B18, 15);
// 计算小车相对于黑线的位置
grayscale_sensor_position = 0;
adc_normalized_sum = 0;
for(uint8 i=0;i<8;i++)
{
adc_normalized[i] = ((float)(adc_white[i] - adc_raw_value[i])) / adc_range[i];
grayscale_sensor_position += adc_normalized[i] * position[i];
adc_normalized_sum += adc_normalized[i];
}
if(adc_normalized_sum > 0)
{
grayscale_sensor_position /= adc_normalized_sum;
}
else
{
grayscale_sensor_position = 0; // 避免除以零,默认位置为0
}
grayscale_sensor_position = grayscale_sensor_position_prev + FILTER_ALPHA * (grayscale_sensor_position - grayscale_sensor_position_prev);
grayscale_sensor_position_prev = grayscale_sensor_position;
}
+13
View File
@@ -0,0 +1,13 @@
#ifndef GRAYSCALESENSOR_H
#define GRAYSCALESENSOR_H
#include "zf_common_typedef.h"
extern volatile float grayscale_sensor_position; // 存储小车相对于黑线的位置
void grayscale_sensor_init(void);
void grayscale_sensor_scan(void);
void grayscale_sensor_set_white(void);
void grayscale_sensor_set_black(void);
#endif
+172
View File
@@ -0,0 +1,172 @@
#include "ICM_42688.h"
//==================================================================================================
// 内部变量
//==================================================================================================
static float accel_scale = 1.0f; // 加速度计 LSB → g
static float gyro_scale = 1.0f; // 陀螺仪 LSB → °/s
//==================================================================================================
// SPI 底层操作宏
//==================================================================================================
#define ICM42688_WRITE_REG(reg, data) spi_write_8bit_register(ICM42688_SPI, reg, data)
#define ICM42688_READ_REGS(reg, data, num) spi_read_8bit_registers(ICM42688_SPI, (reg) | 0x80, data, num)
//==================================================================================================
// 静态函数 — 寄存器级 SPI 操作
//==================================================================================================
/** @brief 向指定寄存器写入一字节
* @param reg 寄存器地址
* @param data 写入值
* 片选 → 写寄存器 → 释放片选
*/
static void icm42688_write_reg(uint8_t reg, uint8_t data)
{
ICM42688_CS_LEVEL(0);
ICM42688_WRITE_REG(reg, data);
ICM42688_CS_LEVEL(1);
}
/** @brief 从指定寄存器连续读取多字节
* @param reg 起始寄存器地址
* @param data 输出缓冲区指针
* @param num 读取字节数
* 片选 → 读多字节 → 释放片选
*/
static void icm42688_read_regs(uint8_t reg, uint8_t *data, uint8_t num)
{
ICM42688_CS_LEVEL(0);
ICM42688_READ_REGS(reg, data, num);
ICM42688_CS_LEVEL(1);
}
/** @brief 将两个 uint8 拼接为 int16(大端序)
* @param hi 高字节
* @param lo 低字节
* @return 有符号 16 位整数
*/
static int16_t icm42688_combine_bytes(uint8_t hi, uint8_t lo)
{
return (int16_t)(((uint16_t)hi << 8) | lo);
}
/** @brief 配置加速度计/陀螺仪的量程和输出速率
* @param afs 加速度计量程
* @param aodr 加速度计输出速率
* @param gfs 陀螺仪量程
* @param godr 陀螺仪输出速率
* 同时更新内部比例系数 accel_scale / gyro_scale
*/
static void icm42688_set_range_odr(enum icm42688_afs afs, enum icm42688_aodr aodr,
enum icm42688_gfs gfs, enum icm42688_godr godr)
{
icm42688_write_reg(ICM42688_ACCEL_CONFIG0, (afs << 5) | (aodr + 1));
icm42688_write_reg(ICM42688_GYRO_CONFIG0, (gfs << 5) | (godr + 1));
switch (afs) {
case ICM42688_AFS_2G: accel_scale = 2000.0f / 32768.0f; break;
case ICM42688_AFS_4G: accel_scale = 4000.0f / 32768.0f; break;
case ICM42688_AFS_8G: accel_scale = 8000.0f / 32768.0f; break;
case ICM42688_AFS_16G: accel_scale = 16000.0f / 32768.0f; break;
default: accel_scale = 1.0f; break;
}
switch (gfs) {
case ICM42688_GFS_15_625DPS: gyro_scale = 15.625f / 32768.0f; break;
case ICM42688_GFS_31_25DPS: gyro_scale = 31.25f / 32768.0f; break;
case ICM42688_GFS_62_5DPS: gyro_scale = 62.5f / 32768.0f; break;
case ICM42688_GFS_125DPS: gyro_scale = 125.0f / 32768.0f; break;
case ICM42688_GFS_250DPS: gyro_scale = 250.0f / 32768.0f; break;
case ICM42688_GFS_500DPS: gyro_scale = 500.0f / 32768.0f; break;
case ICM42688_GFS_1000DPS: gyro_scale = 1000.0f / 32768.0f; break;
case ICM42688_GFS_2000DPS: gyro_scale = 2000.0f / 32768.0f; break;
default: gyro_scale = 1.0f; break;
}
}
//==================================================================================================
// 公开接口
//==================================================================================================
/** @brief 返回当前陀螺仪比例系数 (LSB → °/s)
* 供 imu_calibrate_gyro() 将原始 ADC 均值转换为物理偏移量
*/
float icm42688_gyro_scale(void)
{
return gyro_scale;
}
/** @brief 初始化 ICM-42688
* 1. 初始化 SPI 外设和 CS 引脚
* 2. 读取 WHO_AM_I 进行自检(超时 500ms 后报错死循环)
* 3. 复位并配置量程/速率(默认 ±16G / ±2000dps / 200Hz ODR)
* 4. 设置为低噪声模式
* 由 imu_init() 内部调用,用户一般不直接调用
*/
void icm42688_init(void)
{
system_delay_ms(10);
spi_init(ICM42688_SPI, SPI_MODE0, ICM42688_SPI_SPEED,
ICM42688_SPC_PIN, ICM42688_SDI_PIN, ICM42688_SDO_PIN, SPI_CS_NULL);
gpio_init(ICM42688_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL);
uint8_t model = 0xFF;
int timeout = 50;
while (1) {
icm42688_read_regs(ICM42688_WHO_AM_I, &model, 1);
if (model == 0x47) {
break;
}
ICM42688_DELAY_MS(10);
if (--timeout < 0) {
zf_log(0, "ICM42688 Init Error!");
while (1);
}
}
icm42688_write_reg(ICM42688_PWR_MGMT0, 0x00);
ICM42688_DELAY_MS(20);
// 如果修改了采样频率(定时器中断周期),则需要对应修改下方的配置
icm42688_set_range_odr(ICM42688_AFS_16G, ICM42688_AODR_200HZ,
ICM42688_GFS_2000DPS, ICM42688_GODR_200HZ);
icm42688_write_reg(ICM42688_PWR_MGMT0, 0x0F);
ICM42688_DELAY_MS(10);
}
/** @brief 读取全部传感器数据(加速度 + 角速度)
* @param data 输出结构体指针
* 一次 12 字节 SPI 突发从 ACCEL_DATA_X1 开始连续读取
* 读取顺序: AX→AY→AZ→GX→GY→GZ(与传感器内部 FIFO 顺序一致)
*/
void icm42688_read_all(icm42688_data_t *data)
{
uint8_t buf[12];
icm42688_read_regs(ICM42688_ACCEL_DATA_X1, buf, 12);
data->accel_x = accel_scale * icm42688_combine_bytes(buf[0], buf[1]);
data->accel_y = accel_scale * icm42688_combine_bytes(buf[2], buf[3]);
data->accel_z = accel_scale * icm42688_combine_bytes(buf[4], buf[5]);
data->gyro_x = gyro_scale * icm42688_combine_bytes(buf[6], buf[7]);
data->gyro_y = gyro_scale * icm42688_combine_bytes(buf[8], buf[9]);
data->gyro_z = gyro_scale * icm42688_combine_bytes(buf[10], buf[11]);
}
/** @brief 读取陀螺仪原始 ADC 值(不做比例换算)
* @param gx/gy/gz 输出 int16 原始值指针
* 供 imu_calibrate_gyro() 在静止状态下采集原始数据计算零偏
*/
void icm42688_read_gyro_raw(int16_t *gx, int16_t *gy, int16_t *gz)
{
uint8_t buf[6];
icm42688_read_regs(ICM42688_GYRO_DATA_X1, buf, 6);
*gx = icm42688_combine_bytes(buf[0], buf[1]);
*gy = icm42688_combine_bytes(buf[2], buf[3]);
*gz = icm42688_combine_bytes(buf[4], buf[5]);
}
+198
View File
@@ -0,0 +1,198 @@
#ifndef __ICM_42688_H
#define __ICM_42688_H
#include "zf_common_headfile.h"
//==================================================================================================
// ICM-42688-P 6轴惯性传感器 硬件抽象层
// 本文件仅负责 SPI 通信、寄存器读写、原始数据获取,不涉及姿态解算
//==================================================================================================
// SPI 引脚定义
#define ICM42688_SPI (SPI_1)
#define ICM42688_SPI_SPEED (8 * 1000 * 1000)
#define ICM42688_SPC_PIN (SPI1_SCK_B23)
#define ICM42688_SDI_PIN (SPI1_MOSI_B22)
#define ICM42688_SDO_PIN (SPI1_MISO_B21)
#define ICM42688_CS_PIN (B19)
#define ICM42688_DELAY_MS(time) (system_delay_ms(time))
#define ICM42688_CS_LEVEL(level) gpio_set_level(ICM42688_CS_PIN, level)
// 传感器原始数据(物理单位:加速度 g,角速度 °/s,传感器坐标系)
typedef struct {
float accel_x, accel_y, accel_z;
float gyro_x, gyro_y, gyro_z;
} icm42688_data_t;
// 加速度计量程
enum icm42688_afs {
ICM42688_AFS_16G,
ICM42688_AFS_8G,
ICM42688_AFS_4G,
ICM42688_AFS_2G,
};
// 加速度计输出速率 (ODR)
enum icm42688_aodr {
ICM42688_AODR_32000HZ,
ICM42688_AODR_16000HZ,
ICM42688_AODR_8000HZ,
ICM42688_AODR_4000HZ,
ICM42688_AODR_2000HZ,
ICM42688_AODR_1000HZ,
ICM42688_AODR_200HZ,
ICM42688_AODR_100HZ,
ICM42688_AODR_50HZ,
ICM42688_AODR_25HZ,
ICM42688_AODR_12_5HZ,
ICM42688_AODR_6_25HZ,
ICM42688_AODR_3_125HZ,
ICM42688_AODR_1_5625HZ,
ICM42688_AODR_500HZ,
};
// 陀螺仪量程
enum icm42688_gfs {
ICM42688_GFS_2000DPS,
ICM42688_GFS_1000DPS,
ICM42688_GFS_500DPS,
ICM42688_GFS_250DPS,
ICM42688_GFS_125DPS,
ICM42688_GFS_62_5DPS,
ICM42688_GFS_31_25DPS,
ICM42688_GFS_15_625DPS,
};
// 陀螺仪输出速率 (ODR)
enum icm42688_godr {
ICM42688_GODR_32000HZ,
ICM42688_GODR_16000HZ,
ICM42688_GODR_8000HZ,
ICM42688_GODR_4000HZ,
ICM42688_GODR_2000HZ,
ICM42688_GODR_1000HZ,
ICM42688_GODR_200HZ,
ICM42688_GODR_100HZ,
ICM42688_GODR_50HZ,
ICM42688_GODR_25HZ,
ICM42688_GODR_12_5HZ,
ICM42688_GODR_X0HZ,
ICM42688_GODR_X1HZ,
ICM42688_GODR_X2HZ,
ICM42688_GODR_500HZ,
};
//==================================================================================================
// 公开接口(由 IMU 层调用,用户一般不直接使用)
//==================================================================================================
/** @brief 初始化 ICM-42688(SPI 配置 + 寄存器设置 + 自检)
* 由 imu_init() 内部调用,用户无需单独调用
*/
void icm42688_init(void);
/** @brief 读取加速度和角速度(物理单位,传感器坐标系)
* @param data 输出结构体指针
* 一次 12 字节 SPI 突发读取,节省通信时间
*/
void icm42688_read_all(icm42688_data_t *data);
/** @brief 读取陀螺仪原始 ADC 值(不含比例换算)
* @param gx/gy/gz 输出 int16 原始值指针
* 供校准函数使用
*/
void icm42688_read_gyro_raw(int16_t *gx, int16_t *gy, int16_t *gz);
/** @brief 返回当前陀螺仪比例系数 (LSB → °/s)
* 供校准函数计算零偏
*/
float icm42688_gyro_scale(void);
//==================================================================================================
// 寄存器地址
//==================================================================================================
// Bank 0
#define ICM42688_DEVICE_CONFIG 0x11
#define ICM42688_DRIVE_CONFIG 0x13
#define ICM42688_INT_CONFIG 0x14
#define ICM42688_FIFO_CONFIG 0x16
#define ICM42688_TEMP_DATA1 0x1D
#define ICM42688_TEMP_DATA0 0x1E
#define ICM42688_ACCEL_DATA_X1 0x1F
#define ICM42688_ACCEL_DATA_X0 0x20
#define ICM42688_ACCEL_DATA_Y1 0x21
#define ICM42688_ACCEL_DATA_Y0 0x22
#define ICM42688_ACCEL_DATA_Z1 0x23
#define ICM42688_ACCEL_DATA_Z0 0x24
#define ICM42688_GYRO_DATA_X1 0x25
#define ICM42688_GYRO_DATA_X0 0x26
#define ICM42688_GYRO_DATA_Y1 0x27
#define ICM42688_GYRO_DATA_Y0 0x28
#define ICM42688_GYRO_DATA_Z1 0x29
#define ICM42688_GYRO_DATA_Z0 0x2A
#define ICM42688_TMST_FSYNCH 0x2B
#define ICM42688_TMST_FSYNCL 0x2C
#define ICM42688_INT_STATUS 0x2D
#define ICM42688_FIFO_COUNTH 0x2E
#define ICM42688_FIFO_COUNTL 0x2F
#define ICM42688_FIFO_DATA 0x30
#define ICM42688_APEX_DATA0 0x31
#define ICM42688_APEX_DATA1 0x32
#define ICM42688_APEX_DATA2 0x33
#define ICM42688_APEX_DATA3 0x34
#define ICM42688_APEX_DATA4 0x35
#define ICM42688_APEX_DATA5 0x36
#define ICM42688_INT_STATUS2 0x37
#define ICM42688_INT_STATUS3 0x38
#define ICM42688_SIGNAL_PATH_RESET 0x4B
#define ICM42688_INTF_CONFIG0 0x4C
#define ICM42688_INTF_CONFIG1 0x4D
#define ICM42688_PWR_MGMT0 0x4E
#define ICM42688_GYRO_CONFIG0 0x4F
#define ICM42688_ACCEL_CONFIG0 0x50
#define ICM42688_GYRO_CONFIG1 0x51
#define ICM42688_GYRO_ACCEL_CONFIG0 0x52
#define ICM42688_ACCEL_CONFIG1 0x53
#define ICM42688_TMST_CONFIG 0x54
#define ICM42688_APEX_CONFIG0 0x56
#define ICM42688_SMD_CONFIG 0x57
#define ICM42688_FIFO_CONFIG1 0x5F
#define ICM42688_FIFO_CONFIG2 0x60
#define ICM42688_FIFO_CONFIG3 0x61
#define ICM42688_FSYNC_CONFIG 0x62
#define ICM42688_INT_CONFIG0 0x63
#define ICM42688_INT_CONFIG1 0x64
#define ICM42688_INT_SOURCE0 0x65
#define ICM42688_INT_SOURCE1 0x66
#define ICM42688_INT_SOURCE3 0x68
#define ICM42688_INT_SOURCE4 0x69
#define ICM42688_FIFO_LOST_PKT0 0x6C
#define ICM42688_FIFO_LOST_PKT1 0x6D
#define ICM42688_SELF_TEST_CONFIG 0x70
#define ICM42688_WHO_AM_I 0x75
#define ICM42688_REG_BANK_SEL 0x76
// Bank 1
#define ICM42688_SENSOR_CONFIG0 0x03
#define ICM42688_GYRO_CONFIG_STATIC2 0x0B
#define ICM42688_GYRO_CONFIG_STATIC3 0x0C
#define ICM42688_GYRO_CONFIG_STATIC4 0x0D
#define ICM42688_GYRO_CONFIG_STATIC5 0x0E
#define ICM42688_GYRO_CONFIG_STATIC6 0x0F
#define ICM42688_GYRO_CONFIG_STATIC7 0x10
#define ICM42688_GYRO_CONFIG_STATIC8 0x11
#define ICM42688_GYRO_CONFIG_STATIC9 0x12
#define ICM42688_GYRO_CONFIG_STATIC10 0x13
#define ICM42688_XG_ST_DATA 0x5F
#define ICM42688_YG_ST_DATA 0x60
#define ICM42688_ZG_ST_DATA 0x61
#define ICM42688_TMSTVAL0 0x62
#define ICM42688_TMSTVAL1 0x63
#define ICM42688_TMSTVAL2 0x64
#define ICM42688_INTF_CONFIG4 0x7A
#define ICM42688_INTF_CONFIG5 0x7B
#define ICM42688_INTF_CONFIG6 0x7C
#endif
+374
View File
@@ -0,0 +1,374 @@
#include "IMU.h"
#include <math.h>
//==================================================================================================
// 常量
//==================================================================================================
#ifndef PI
#define PI 3.141592654f
#endif
#define TWO_KP_DEF (2.0f * 0.5f) // Mahony 比例增益(默认 1.0)
#define TWO_KI_DEF (2.0f * 0.0f) // Mahony 积分增益(默认 0, 关闭)
//==================================================================================================
// Mahony 滤波器状态(静态,本文件内可见)
//==================================================================================================
static float inv_sample_freq; // 1 / 采样频率
static float two_kp = TWO_KP_DEF; // 比例增益
static float two_ki = TWO_KI_DEF; // 积分增益
static float q0 = 1.0f, q1 = 0.0f, q2 = 0.0f, q3 = 0.0f; // 姿态四元数
static float integral_fbx = 0.0f, integral_fby = 0.0f, integral_fbz = 0.0f; // 积分误差项
//==================================================================================================
// 陀螺仪零偏(由 imu_calibrate_gyro 填入)
//==================================================================================================
static float gyro_bias_x = 0.0f;
static float gyro_bias_y = 0.0f;
static float gyro_bias_z = 0.0f;
//==================================================================================================
// 姿态输出
//==================================================================================================
volatile imu_attitude_t imu_angle;
volatile int yaw_round_count = 0;
volatile static float yaw_angle_last = 0.0f;
//==================================================================================================
// 双二阶滤波器状态
//==================================================================================================
static biquad_state_t bq_gyro_x, bq_gyro_y, bq_gyro_z;
static biquad_state_t bq_accel_x, bq_accel_y, bq_accel_z;
//==================================================================================================
// 公开接口实现
//==================================================================================================
/** @brief 初始化 IMU
* @param sample_freq_hz 采样频率(Hz),等于定时器中断频率
* 1. 初始化 ICM-42688 硬件
* 2. 配置 Mahony 采样周期
* 3. 初始化各轴陀螺仪/加速度计双二阶滤波器
* 滤波器参数:
* 陀螺仪 X/Y/Z: 低通 30/20/30Hz → 滤除高频振动
* 加速度计 X/Y/Z: 低通 10Hz → 重力矢量提取(响应慢但稳)
*/
void imu_init(int sample_freq_hz)
{
icm42688_init();
inv_sample_freq = 1.0f / sample_freq_hz;
biquad_init(&bq_gyro_x, BIQUAD_LOWPASS, sample_freq_hz, 30, 0.7071f);
biquad_init(&bq_gyro_y, BIQUAD_LOWPASS, sample_freq_hz, 20, 0.5773f);
biquad_init(&bq_gyro_z, BIQUAD_LOWPASS, sample_freq_hz, 30, 0.5773f);
biquad_init(&bq_accel_x, BIQUAD_LOWPASS, sample_freq_hz, 10, 0.5773f);
biquad_init(&bq_accel_y, BIQUAD_LOWPASS, sample_freq_hz, 10, 0.5773f);
biquad_init(&bq_accel_z, BIQUAD_LOWPASS, sample_freq_hz, 10, 0.5773f);
}
/** @brief 更新姿态(定时器 ISR 中按固定频率调用)
* 数据流:传感器 → 零偏修正 → 双二阶滤波 → Mahony → 欧拉角 → Yaw 连续角度
* 传感器坐标系直通,无坐标轴转换
* 陀螺仪数据不进 Mahony 前只做偏置修正(Mahony 内部自带角速度积分处理)
* 加速度数据经低通滤波后送入 Mahony 做重力矢量参考
*/
void imu_update(void)
{
icm42688_data_t raw;
icm42688_read_all(&raw);
// 零偏修正
raw.gyro_x -= gyro_bias_x;
raw.gyro_y -= gyro_bias_y;
raw.gyro_z -= gyro_bias_z;
// 滤波(传感器坐标系,不做轴转换)
imu_angle.gyro_x = biquad_apply(&bq_gyro_x, raw.gyro_x);
imu_angle.gyro_y = biquad_apply(&bq_gyro_y, raw.gyro_y);
imu_angle.gyro_z = biquad_apply(&bq_gyro_z, raw.gyro_z);
float ax_f = biquad_apply(&bq_accel_x, raw.accel_x);
float ay_f = biquad_apply(&bq_accel_y, raw.accel_y);
float az_f = biquad_apply(&bq_accel_z, raw.accel_z);
// Mahony AHRS 姿态解算
mahony_ahrs_update(raw.gyro_x, raw.gyro_y, raw.gyro_z, ax_f, ay_f, az_f);
// Yaw 连续角度跟踪(处理 ±180° 跳变)
if (imu_angle.yaw - yaw_angle_last > 180.0f) {
yaw_round_count--;
} else if (imu_angle.yaw - yaw_angle_last < -180.0f) {
yaw_round_count++;
}
yaw_angle_last = imu_angle.yaw;
}
/** @brief 陀螺仪零偏校准
* 必须在设备完全静止时调用,采集 3 秒陀螺仪原始数据
* 每秒采样 1000 点取均值,3 秒的均值再取平均,乘以比例系数得到 °/s 零偏
* 校准结果自动存入 gyro_bias_x/y/z,在后续 imu_update() 中生效
*/
void imu_calibrate_gyro(void)
{
#define CALIB_SECONDS 3
#define CALIB_SAMPLES 1000
static float gyro_history[3][CALIB_SECONDS];
int32_t gyro_sum[3] = {0, 0, 0};
uint32_t sec_cnt = 0, sample_cnt = 0;
system_delay_ms(1000);
system_delay_ms(1000);
do {
system_delay_us(1000);
int16_t gx_r, gy_r, gz_r;
icm42688_read_gyro_raw(&gx_r, &gy_r, &gz_r);
if (sample_cnt < CALIB_SAMPLES) {
gyro_sum[0] += gx_r;
gyro_sum[1] += gy_r;
gyro_sum[2] += gz_r;
sample_cnt++;
} else {
gyro_history[0][sec_cnt] = (float)gyro_sum[0] / CALIB_SAMPLES;
gyro_history[1][sec_cnt] = (float)gyro_sum[1] / CALIB_SAMPLES;
gyro_history[2][sec_cnt] = (float)gyro_sum[2] / CALIB_SAMPLES;
gyro_sum[0] = 0;
gyro_sum[1] = 0;
gyro_sum[2] = 0;
sample_cnt = 0;
sec_cnt++;
}
} while (sec_cnt < CALIB_SECONDS);
float sum[3] = {0, 0, 0};
float k = icm42688_gyro_scale() / CALIB_SECONDS;
for (uint8_t i = 0; i < CALIB_SECONDS; i++) {
sum[0] += gyro_history[0][i];
sum[1] += gyro_history[1][i];
sum[2] += gyro_history[2][i];
}
gyro_bias_x = k * sum[0];
gyro_bias_y = k * sum[1];
gyro_bias_z = k * sum[2];
}
//==================================================================================================
// 算法实现
//==================================================================================================
/** @brief Mahony AHRS 6轴姿态解算
* @param gx/gy/gz 陀螺仪角速度 (°/s)
* @param ax/ay/az 加速度计测量值 (g)
*
* 算法流程:
* 1. 角速度转弧度,加速度归一化
* 2. 由当前四元数估计重力方向
* 3. 估计重力与测量重力的叉积 → PI 反馈修正陀螺仪
* 4. 一阶龙格-库塔积分更新四元数
* 5. 四元数归一化
* 6. 提取欧拉角写入 imu_angle
*
* 参考: S.O.H. Madgwick "An efficient orientation filter for IMU and MARG sensor arrays"
*/
void mahony_ahrs_update(float gx, float gy, float gz, float ax, float ay, float az)
{
float recip_norm;
float halfvx, halfvy, halfvz;
float halfex, halfey, halfez;
float qa, qb, qc;
// 仅当加速度计有读数时执行修正(静止或匀加速时加速度计才可靠)
if (!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {
// 角速度 → rad/s
gx *= ANG2RAD;
gy *= ANG2RAD;
gz *= ANG2RAD;
// 加速度归一化
recip_norm = inv_sqrt(ax * ax + ay * ay + az * az);
ax *= recip_norm;
ay *= recip_norm;
az *= recip_norm;
// 由当前四元数估计重力方向(世界系 Z 轴在传感器系的投影)
halfvx = q1 * q3 - q0 * q2;
halfvy = q0 * q1 + q2 * q3;
halfvz = q0 * q0 - 0.5f + q3 * q3;
// 叉积 = 估计方向 × 测量方向 → 姿态误差
halfex = (ay * halfvz - az * halfvy);
halfey = (az * halfvx - ax * halfvz);
halfez = (ax * halfvy - ay * halfvx);
// 积分反馈(默认 ki=0, 关闭)
if (two_ki > 0.0f) {
integral_fbx += two_ki * halfex * inv_sample_freq;
integral_fby += two_ki * halfey * inv_sample_freq;
integral_fbz += two_ki * halfez * inv_sample_freq;
gx += integral_fbx;
gy += integral_fby;
gz += integral_fbz;
} else {
integral_fbx = 0.0f;
integral_fby = 0.0f;
integral_fbz = 0.0f;
}
// 比例反馈
gx += two_kp * halfex;
gy += two_kp * halfey;
gz += two_kp * halfez;
}
// 四元数一阶积分 (RK1)
gx *= (0.5f * inv_sample_freq);
gy *= (0.5f * inv_sample_freq);
gz *= (0.5f * inv_sample_freq);
qa = q0; qb = q1; qc = q2;
q0 += (-qb * gx - qc * gy - q3 * gz);
q1 += ( qa * gx + qc * gz - q3 * gy);
q2 += ( qa * gy - qb * gz + q3 * gx);
q3 += ( qa * gz + qb * gy - qc * gx);
// 四元数归一化
recip_norm = inv_sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
q0 *= recip_norm;
q1 *= recip_norm;
q2 *= recip_norm;
q3 *= recip_norm;
// 旋转矩阵 → 欧拉角(传感器坐标系)
float r11 = 2.0f * (q0 * q1 + q2 * q3);
float r12 = 1.0f - 2.0f * (q1 * q1 + q2 * q2);
float r21 = 2.0f * (q0 * q2 - q3 * q1);
float r31 = 2.0f * (q0 * q3 + q1 * q2);
float r32 = 1.0f - 2.0f * (q2 * q2 + q3 * q3);
imu_angle.pitch = RAD2ANG * asinf(r21);
imu_angle.roll = RAD2ANG * atan2f(r11, r12);
imu_angle.yaw = RAD2ANG * atan2f(r31, r32);
}
/** @brief 双二阶滤波器系数初始化
* @param state 滤波器状态
* @param type 滤波器类型
* @param fs 采样率 (Hz)
* @param fc 截止/中心频率 (Hz)
* @param q 品质因数
*
* 通用双二阶传递函数:
* H(z) = (b0 + b1*z^-1 + b2*z^-2) / (a0 + a1*z^-1 + a2*z^-2)
*
* Q 值参考:
* 0.5773 Thomson-Bessel → 最平坦群延迟, 相位失真最小
* 0.7071 Butterworth → 通带最平坦, 常用默认值
* 0.9565 Chebyshev 1dB → 陡峭过渡带, 允许 1dB 通带波纹
*/
void biquad_init(biquad_state_t *state, biquad_type_t type, int fs, float fc, float q)
{
float w0 = 2.0f * PI * fc / fs;
float sin_w0 = sinf(w0);
float cos_w0 = cosf(w0);
float alpha = sin_w0 / (2.0f * q);
float b0, b1, b2, a0, a1, a2;
switch (type) {
case BIQUAD_LOWPASS:
b0 = (1.0f - cos_w0) / 2.0f;
b1 = b0 * 2.0f;
b2 = b0;
a0 = 1.0f + alpha;
a1 = -2.0f * cos_w0;
a2 = 1.0f - alpha;
break;
case BIQUAD_HIGHPASS:
b0 = (1.0f + cos_w0) / 2.0f;
b1 = -b0 * 2.0f;
b2 = b0;
a0 = 1.0f + alpha;
a1 = -2.0f * cos_w0;
a2 = 1.0f - alpha;
break;
case BIQUAD_BANDPASS_PEAK:
b0 = alpha;
b1 = 0.0f;
b2 = -alpha;
a0 = 1.0f + alpha;
a1 = -2.0f * cos_w0;
a2 = 1.0f - alpha;
break;
case BIQUAD_BANDSTOP_NOTCH:
b0 = 1.0f;
b1 = -2.0f * cos_w0;
b2 = 1.0f;
a0 = 1.0f + alpha;
a1 = -2.0f * cos_w0;
a2 = 1.0f - alpha;
break;
}
// 归一化系数(除以 a0)
state->a0 = b0 / a0;
state->a1 = b1 / a0;
state->a2 = b2 / a0;
state->a3 = a1 / a0;
state->a4 = a2 / a0;
state->x1 = 0.0f;
state->x2 = 0.0f;
state->y1 = 0.0f;
state->y2 = 0.0f;
}
/** @brief 双二阶滤波器单步迭代
* @param state 滤波器状态
* @param data 当前输入
* @return 当前输出
*
* 差分方程:
* y[n] = a0*x[n] + a1*x[n-1] + a2*x[n-2] - a3*y[n-1] - a4*y[n-2]
*/
float biquad_apply(biquad_state_t *state, float data)
{
float result = state->a0 * data
+ state->a1 * state->x1
+ state->a2 * state->x2
- state->a3 * state->y1
- state->a4 * state->y2;
state->x2 = state->x1;
state->x1 = data;
state->y2 = state->y1;
state->y1 = result;
return result;
}
/** @brief 快速平方根倒数 (Fast Inverse Square Root)
* @param x 输入正数
* @return 1/sqrt(x) 近似值
*
* 使用 Quake III 的经典 magic number 0x5f3759df
* 精度约 0.1%, 在无 FPU 的 M0+ 上远快于 1.0f/sqrtf(x)
*/
float inv_sqrt(float x)
{
float halfx = 0.5f * x;
float y = x;
long i = *(long *)&y;
i = 0x5f3759df - (i >> 1);
y = *(float *)&i;
y = y * (1.5f - (halfx * y * y)); // 一次 Newton 迭代
return y;
}
+105
View File
@@ -0,0 +1,105 @@
#ifndef __IMU_H
#define __IMU_H
#include "ICM_42688.h"
//==================================================================================================
// IMU 姿态解算层
// 负责:传感器数据滤波 → Mahony AHRS 姿态解算 → 欧拉角输出
// 所有数据基于传感器坐标系(无机体坐标转换)
//==================================================================================================
#define ANG2RAD 0.01745329252f // 角度制 → 弧度制
#define RAD2ANG 57.295779513f // 弧度制 → 角度制
//==================================================================================================
// 双二阶滤波器 (Biquad Filter)
//==================================================================================================
/** @brief 滤波器类型 */
typedef enum {
BIQUAD_LOWPASS, // 低通
BIQUAD_HIGHPASS, // 高通
BIQUAD_BANDPASS_PEAK, // 带通(峰值)
BIQUAD_BANDSTOP_NOTCH, // 带阻(陷波)
} biquad_type_t;
/** @brief 滤波器状态(系数 + 历史值)
* 典型 Q 值: 0.5773 (Thomson-Bessel, 相位线性度好)
* 0.7071 (Butterworth, 最平坦)
* 0.9565 (Chebyshev 1dB, 阻带衰减快)
*/
typedef struct {
float a0, a1, a2, a3, a4; // 传递函数系数
float x1, x2, y1, y2; // 历史输入/输出
} biquad_state_t;
//==================================================================================================
// 姿态输出
//==================================================================================================
/** @brief 姿态数据(传感器坐标系,volatile 因为 ISR 写入、主循环读取) */
typedef struct {
float pitch, roll, yaw; // 欧拉角 (°)
float gyro_x, gyro_y, gyro_z; // 滤波后角速度 (°/s)
} imu_attitude_t;
extern volatile imu_attitude_t imu_angle; // 当前姿态
extern volatile int yaw_round_count;
//==================================================================================================
// 用户接口
//==================================================================================================
/** @brief 初始化 IMU(传感器 + 滤波器 + Mahony)
* @param sample_freq_hz 采样频率(Hz),需与定时器中断频率一致,典型值 200
* 用户只需调用此函数,内部自动调用 icm42688_init()
*/
void imu_init(int sample_freq_hz);
/** @brief 更新姿态(在定时器 ISR 中以固定频率调用)
* 读取传感器 → 零偏修正 → 双二阶滤波 → Mahony 解算 → 写入 imu_angle
* 执行时间约 100~150us(80MHz Cortex-M0+ 估算),需保证在中断周期内完成
*/
void imu_update(void);
/** @brief 陀螺仪零偏校准(静止状态下调用)
* 采集 3 秒静止数据,计算各轴零偏,自动应用于后续 imu_update()
* 调用时设备必须完全静止
*/
void imu_calibrate_gyro(void);
//==================================================================================================
// 算法接口(也可被外部直接调用)
//==================================================================================================
/** @brief 双二阶滤波器初始化
* @param state 滤波器状态指针
* @param type 滤波器类型
* @param fs 采样频率 (Hz)
* @param fc 截止频率 (Hz)
* @param q 品质因数
*/
void biquad_init(biquad_state_t *state, biquad_type_t type, int fs, float fc, float q);
/** @brief 双二阶滤波器单步计算
* @param state 滤波器状态指针
* @param data 当前输入值
* @return 滤波后输出值
*/
float biquad_apply(biquad_state_t *state, float data);
/** @brief Mahony AHRS 姿态解算(6轴 IMU 模式)
* @param gx/gy/gz 陀螺仪角速度 (°/s, 传感器坐标系)
* @param ax/ay/az 加速度计测量值 (g, 传感器坐标系)
* 输出写入全局变量 imu_angle.pitch/roll/yaw
*/
void mahony_ahrs_update(float gx, float gy, float gz, float ax, float ay, float az);
/** @brief 快速平方根倒数(Quake III 算法)
* @param x 输入值
* @return 1/sqrt(x) 的近似值
*/
float inv_sqrt(float x);
#endif
+33
View File
@@ -0,0 +1,33 @@
#include "Motor.h"
#include "zf_driver_gpio.h"
#include "zf_driver_pwm.h"
#include "PID_Controller.h"
#include "MotorEncoder.h"
void motor_init(void)
{
gpio_init(DIR_L, GPO, GPIO_HIGH, GPO_PUSH_PULL);
pwm_init(PWM_L, 17000, 0);
gpio_init(DIR_R, GPO, GPIO_HIGH, GPO_PUSH_PULL);
pwm_init(PWM_R, 17000, 0);
}
// 右电机速度设置
void motor_set_pwm_right(int32 pwm)
{
uint8_t dir = (pwm >= 0) ? 1 : 0;//根据电机接线方式调整方向
uint32 abs_pwm = abs(pwm);
if(pwm > MOTOR_MAX) pwm = MOTOR_MAX;
gpio_set_level(DIR_R, dir);//设置方向
pwm_set_duty(PWM_R, abs_pwm);//设置PWM占空比
}
// 左电机速度设置 - 需要根据实际硬件修改
void motor_set_pwm_left(int32 pwm)
{
uint8_t dir = (pwm >= 0) ? 0 : 1;//根据电机接线方式调整方向
uint32 abs_pwm = abs(pwm);
if(pwm > MOTOR_MAX) pwm = MOTOR_MAX;
gpio_set_level(DIR_L, dir);//设置方向
pwm_set_duty(PWM_L, abs_pwm);//设置PWM占空比
}
+18
View File
@@ -0,0 +1,18 @@
#ifndef __MOTOR_H
#define __MOTOR_H
#include "zf_common_typedef.h"
#define MOTOR_MAX (3000)
#define DIR_R (B11)
#define PWM_R (PWM_TIM_G0_CH0_B10)
#define DIR_L (A27)
#define PWM_L (PWM_TIM_G7_CH0_A26)
void motor_init(void);
void motor_set_pwm_right(int32 pwm);
void motor_set_pwm_left(int32 pwm);
#endif
+76
View File
@@ -0,0 +1,76 @@
#include "MotorEncoder.h"
#include "ti_msp_dl_config.h"
#include "ti/driverlib/dl_timerg.h"
#include "zf_common_interrupt.h"
#include "zf_driver_exti.h"
#include "zf_driver_gpio.h"
#define MOTOR_ENCODER_LEFT_A_PIN A9
#define MOTOR_ENCODER_LEFT_B_PIN A12
volatile motor_encoder_data_t motor_speed_right = {.raw = 0};
volatile motor_encoder_data_t motor_speed_left = {.raw = 0};
/*
由于MSPM0G3507只有一个QEI,因此只能测量一个电机的编码器速度,另一个电机的速度需要通过GPIO中断模拟正交编码器来测量。
分配如下:
- QEI0:右电机编码器
- GPIO中断:左电机编码器
*/
//用中断模拟一个正交编码器(或者用输入捕获)
volatile int16_t left_encoder_count = 0;
//A相中断
void motor_encoder_exit_handler_A(uint32 state, void *ptr)
{
// 读取A相和B相的状态
uint8_t A_state = gpio_get_level(MOTOR_ENCODER_LEFT_A_PIN);
uint8_t B_state = gpio_get_level(MOTOR_ENCODER_LEFT_B_PIN);
// 根据A相和B相的状态更新计数
if(A_state == B_state)
{
left_encoder_count++;
}
else
{
left_encoder_count--;
}
}
//B相中断
void motor_encoder_exit_handler_B(uint32 state, void *ptr)
{
// 读取A相和B相的状态
uint8_t A_state = gpio_get_level(MOTOR_ENCODER_LEFT_A_PIN);
uint8_t B_state = gpio_get_level(MOTOR_ENCODER_LEFT_B_PIN);
// 根据A相和B相的状态更新计数
if(A_state == B_state)
{
left_encoder_count--;
}
else
{
left_encoder_count++;
}
}
void motor_encoder_init(void)
{
//使用QEI
DL_TimerG_startCounter(QEI_0_INST);
//使用GPIO中断模拟正交编码器
exti_init(MOTOR_ENCODER_LEFT_A_PIN, EXTI_TRIGGER_BOTH, motor_encoder_exit_handler_A, NULL);
exti_init(MOTOR_ENCODER_LEFT_B_PIN, EXTI_TRIGGER_BOTH, motor_encoder_exit_handler_B, NULL);
interrupt_set_priority(GPIOA_INT_IRQn, 0);
}
void motor_encoder_update(void)
{
// 读取右电机编码器
motor_speed_right.raw = (uint16_t)DL_TimerG_getTimerCount(QEI_0_INST);
DL_TimerG_setTimerCount(QEI_0_INST, 0); // 读取后清零
// 读取左电机编码器
motor_speed_left.value = left_encoder_count;
left_encoder_count = 0; // 读取后清零
}
+17
View File
@@ -0,0 +1,17 @@
#ifndef MOTORENCODER_H
#define MOTORENCODER_H
#include "zf_common_typedef.h"
typedef union{
uint16_t raw;
int16_t value;
} motor_encoder_data_t;
void motor_encoder_init(void);
void motor_encoder_update(void);
extern volatile motor_encoder_data_t motor_speed_right;
extern volatile motor_encoder_data_t motor_speed_left;
#endif
+232
View File
@@ -0,0 +1,232 @@
/**
* @file controller.c
* @author wanghongxi
* @author modified by neozng
* @brief PID控制器定义
* @version beta
* @date 2022-11-01
*
* @copyrightCopyright (c) 2022 HNU YueLu EC all rights reserved
*/
#include "PID_Controller.h"
#include <math.h>
/* ----------------------------下面是pid优化环节的实现---------------------------- */
// 梯形积分
static void f_Trapezoid_Intergral(PIDInstance *pid)
{
// 计算梯形的面积,(上底+下底)*高/2
pid->ITerm = pid->Ki * ((pid->Err + pid->Last_Err) / 2) * pid->dt;
}
// 变速积分(误差小时积分作用更强)
static void f_Changing_Integration_Rate(PIDInstance *pid)
{
if (pid->Err * pid->Iout > 0)
{
// 积分呈累积趋势
if (fabsf(pid->Err) <= pid->CoefB)
return; // Full integral
if (fabsf(pid->Err) <= (pid->CoefB + pid->CoefA))
pid->ITerm *= (pid->CoefB + pid->CoefA - fabsf(pid->Err)) / pid->CoefA;
else // 最大阈值,不使用积分
pid->ITerm = 0;
}
}
static void f_Integral_Limit(PIDInstance *pid)
{
static float temp_Output, temp_Iout;
temp_Iout = pid->Iout + pid->ITerm;
temp_Output = pid->Pout + pid->Iout + pid->Dout;
if (fabsf(temp_Output) > pid->MaxOut)
{
if (pid->Err * pid->Iout > 0) // 积分却还在累积
{
pid->ITerm = 0; // 当前积分项置零
}
}
if (temp_Iout > pid->IntegralLimit)
{
pid->ITerm = 0;
pid->Iout = pid->IntegralLimit;
}
if (temp_Iout < -pid->IntegralLimit)
{
pid->ITerm = 0;
pid->Iout = -pid->IntegralLimit;
}
}
// 微分先行(仅使用反馈值而不计参考输入的微分)
static void f_Derivative_On_Measurement(PIDInstance *pid)
{
pid->Dout = pid->Kd * (pid->Last_Measure - pid->Measure) / pid->dt;
}
// 微分滤波(采集微分时,滤除高频噪声)
static void f_Derivative_Filter(PIDInstance *pid)
{
pid->Dout = pid->Dout * pid->dt / (pid->Derivative_LPF_RC + pid->dt) +
pid->Last_Dout * pid->Derivative_LPF_RC / (pid->Derivative_LPF_RC + pid->dt);
}
// 输出滤波
static void f_Output_Filter(PIDInstance *pid)
{
pid->Output = pid->Output * pid->dt / (pid->Output_LPF_RC + pid->dt) +
pid->Last_Output * pid->Output_LPF_RC / (pid->Output_LPF_RC + pid->dt);
}
// 输出限幅
static void f_Output_Limit(PIDInstance *pid)
{
if (pid->Output > pid->MaxOut)
{
pid->Output = pid->MaxOut;
}
if (pid->Output < -(pid->MaxOut))
{
pid->Output = -(pid->MaxOut);
}
}
// 电机堵转检测
static void f_PID_ErrorHandle(PIDInstance *pid)
{
/*Motor Blocked Handle*/
if (fabsf(pid->Output) < pid->MaxOut * 0.001f || fabsf(pid->Ref) < 0.0001f)
return;
if ((fabsf(pid->Ref - pid->Measure) / fabsf(pid->Ref)) > 0.95f)
{
// Motor blocked counting
pid->ERRORHandler.ERRORCount++;
}
else
{
pid->ERRORHandler.ERRORCount = 0;
}
if (pid->ERRORHandler.ERRORCount > 500)
{
// Motor blocked over 1000times
pid->ERRORHandler.ERRORType = PID_MOTOR_BLOCKED_ERROR;
}
}
/* ---------------------------下面是PID的外部算法接口--------------------------- */
/**
* @brief 初始化PID,设置参数和启用的优化环节,将其他数据置零
*
* @param pid PID实例
* @param config PID初始化设置
*/
void PIDInit(PIDInstance *pid, PID_Init_Config_s *config)
{
memset(pid, 0, sizeof(PIDInstance));
pid->Kp = config->Kp;
pid->Ki = config->Ki;
pid->Kd = config->Kd;
pid->MaxOut = config->MaxOut;
pid->DeadBand = config->DeadBand;
pid->Improve = config->Improve;
pid->IntegralLimit = config->IntegralLimit;
pid->CoefA = config->CoefA;
pid->CoefB = config->CoefB;
pid->Output_LPF_RC = config->Output_LPF_RC;
pid->Derivative_LPF_RC = config->Derivative_LPF_RC;
pid->dt = config->T;
}
/**
* @brief PID计算
* @param[in] PID结构体
* @param[in] 测量值
* @param[in] 期望值
* @retval 返回空
*/
float PIDCalculate(PIDInstance *pid, float measure, float ref)
{
// 堵转检测
if (pid->Improve & PID_ErrorHandle)
f_PID_ErrorHandle(pid);
if (pid->dt < 0.000001f) // 避免除零
{
return 0.0f;
}
// 保存上次的测量值和误差,计算当前error
pid->Measure = measure;
pid->Ref = ref;
pid->Err = pid->Ref - pid->Measure;
/*
Yaw角误差修正
若err大于180,则应该取反向,负数:-(360-err)=err-360
若err小于-180,则应该取反向,正数:360-(-err)=err+360
*/
if(pid->Improve & PID_Yaw_Error_Corretion)
{
if(pid->Err > 180)
{
pid->Err = pid->Err - 360;
}
else if(pid->Err < -180)
{
pid->Err = pid->Err +360;
}
}
// 如果在死区外,则计算PID
if (fabsf(pid->Err) > pid->DeadBand)
{
// 基本的pid计算,使用位置式
pid->Pout = pid->Kp * pid->Err;
pid->ITerm = pid->Ki * pid->Err * pid->dt;
pid->Dout = pid->Kd * (pid->Err - pid->Last_Err) / pid->dt;
// 梯形积分
if (pid->Improve & PID_Trapezoid_Intergral)
f_Trapezoid_Intergral(pid);
// 变速积分
if (pid->Improve & PID_ChangingIntegrationRate)
f_Changing_Integration_Rate(pid);
// 微分先行
if (pid->Improve & PID_Derivative_On_Measurement)
f_Derivative_On_Measurement(pid);
// 微分滤波器
if (pid->Improve & PID_DerivativeFilter)
f_Derivative_Filter(pid);
// 积分限幅
if (pid->Improve & PID_Integral_Limit)
f_Integral_Limit(pid);
pid->Iout += pid->ITerm; // 累加积分
pid->Output = pid->Pout + pid->Iout + pid->Dout; // 计算输出
// 输出滤波
if (pid->Improve & PID_OutputFilter)
f_Output_Filter(pid);
// 输出限幅
f_Output_Limit(pid);
}
else // 进入死区, 则清空积分和输出
{
pid->Output = 0;
pid->ITerm = 0;
}
// 保存当前数据,用于下次计算
pid->Last_Measure = pid->Measure;
pid->Last_Output = pid->Output;
pid->Last_Dout = pid->Dout;
pid->Last_Err = pid->Err;
pid->Last_ITerm = pid->ITerm;
return pid->Output;
}
+114
View File
@@ -0,0 +1,114 @@
#ifndef _PID_CONTROLLER_H
#define _PID_CONTROLLER_H
#include "zf_common_typedef.h"
// PID 优化环节使能标志位,通过位与可以判断启用的优化环节;也可以改成位域的形式
typedef enum
{
PID_IMPROVE_NONE = 0b00000000, // 0000 0000
PID_Integral_Limit = 0b00000001, // 0000 0001
PID_Derivative_On_Measurement = 0b00000010, // 0000 0010
PID_Trapezoid_Intergral = 0b00000100, // 0000 0100
PID_Yaw_Error_Corretion = 0b00001000, // 0000 1000
PID_OutputFilter = 0b00010000, // 0001 0000
PID_ChangingIntegrationRate = 0b00100000, // 0010 0000
PID_DerivativeFilter = 0b01000000, // 0100 0000
PID_ErrorHandle = 0b10000000, // 1000 0000
} PID_Improvement_e;
/* PID 报错类型枚举*/
typedef enum errorType_e
{
PID_ERROR_NONE = 0x00U,
PID_MOTOR_BLOCKED_ERROR = 0x01U
} ErrorType_e;
typedef struct
{
uint64_t ERRORCount;
ErrorType_e ERRORType;
} PID_ErrorHandler_t;
/* PID结构体 */
typedef struct
{
//---------------------------------- init config block
// config parameter
float Kp;
float Ki;
float Kd;
float MaxOut;
float DeadBand;
// improve parameter
PID_Improvement_e Improve;
float IntegralLimit; // 积分限幅
float CoefA; // 变速积分 For Changing Integral
float CoefB; // 变速积分 ITerm = Err*((A-abs(err)+B)/A) when B<|err|<A+B
float Output_LPF_RC; // 输出滤波器 RC = 1/omegac
float Derivative_LPF_RC; // 微分滤波器系数
//-----------------------------------
// for calculating
float Measure;
float Last_Measure;
float Err;
float Last_Err;
float Last_ITerm;
float Pout;
float Iout;
float Dout;
float ITerm;
float Output;
float Last_Output;
float Last_Dout;
float Ref;
float dt;
PID_ErrorHandler_t ERRORHandler;
} PIDInstance;
/* 用于PID初始化的结构体*/
typedef struct // config parameter
{
// basic parameter
float Kp;
float Ki;
float Kd;
float MaxOut; // 输出限幅
float DeadBand; // 死区
float T;
// improve parameter
PID_Improvement_e Improve;
float IntegralLimit; // 积分限幅
float CoefA; // AB为变速积分参数,变速积分实际上就引入了积分分离
float CoefB; // ITerm = Err*((A-abs(err)+B)/A) when B<|err|<A+B
float Output_LPF_RC; // RC = 1/omegac
float Derivative_LPF_RC;
} PID_Init_Config_s;
/**
* @brief 初始化PID实例
* @todo 待修改为统一的PIDRegister风格
* @param pid PID实例指针
* @param config PID初始化配置
*/
void PIDInit(PIDInstance *pid, PID_Init_Config_s *config);
/**
* @brief 计算PID输出
*
* @param pid PID实例指针
* @param measure 反馈值
* @param ref 设定值
* @return float PID计算输出
*/
float PIDCalculate(PIDInstance *pid, float measure, float ref);
#endif
+158
View File
@@ -0,0 +1,158 @@
#include "Task.h"
#include "zf_driver_pit.h"
#include "zf_device_key.h"
#include "zf_common_interrupt.h"
#include "IMU.h"
#include "Beep.h"
#include "GrayscaleSensor.h"
#include "Motor.h"
#include "MotorEncoder.h"
#include "PID_Controller.h"
#include "Command.h"
volatile uint8_t motor_control_task_enable = 0;
volatile uint8_t angle_control_task_enable = 0;
volatile uint8_t position_control_task_enable = 0;
/*速度环的输入,开启角度环后由角度环接管(范围-50到+50)*/
volatile int16_t motor_speed_right_ref = 0;
volatile int16_t motor_speed_left_ref = 0;
/*角度环接管速度之后的基础直行速度*/
volatile int16_t motor_speed_base = 0;
/*角度环输入,开启位置环后由位置环接管*/
volatile float yaw_ref = 0;
/*位置环的输出*/
volatile float angle_velocity = 0;
volatile PIDInstance pid_speed_right={0};
volatile PIDInstance pid_speed_left={0};
volatile PIDInstance pid_yaw = {0};
volatile PIDInstance pid_position = {0};
void motor_control_init(float T);
void angle_control_init(float T);
void position_control_init(float T);
void angle_control_task(void);
void position_control_task(void);
void motor_control_task(void);
void Task_10ms(uint32 state, void *ptr)
{
// 10ms 执行一次的任务代码(100Hz)
motor_encoder_update();
if(motor_control_task_enable)
motor_control_task();
}
void Task_20ms(uint32 state, void *ptr)
{
// 20ms 执行一次的任务代码(50Hz)
grayscale_sensor_scan();
if(position_control_task_enable)
position_control_task();
imu_update();
if(angle_control_task_enable)
angle_control_task();
}
void Task_50ms(uint32 state, void *ptr)
{
// 50ms 执行一次的任务代码(20Hz)
key_scanner();
beep_actuator();
}
void task_init(void)
{
motor_control_init(0.01f);
angle_control_init(0.02f);
position_control_init(0.02f);
pit_ms_init(PIT_TIM_A0,10,Task_10ms,NULL);
interrupt_set_priority(TIMA0_INT_IRQn,1);
pit_ms_init(PIT_TIM_A1,20,Task_20ms,NULL);
interrupt_set_priority(TIMA1_INT_IRQn,1);
pit_ms_init(PIT_TIM_G6,50,Task_50ms,NULL);
interrupt_set_priority(TIMG6_INT_IRQn,7);
}
void motor_control_init(float T)
{
PID_Init_Config_s config_right = {
.Kp = 300.0f,
.Ki = 150.0f,
.Kd = 0.0f,
.T = T,
.MaxOut = MOTOR_MAX
};
PIDInit((PIDInstance *)&pid_speed_right, &config_right);
PID_Init_Config_s config_left = {
.Kp = 300.0f,
.Ki = 150.0f,
.Kd = 0.0f,
.T = T,
.MaxOut = MOTOR_MAX
};
PIDInit((PIDInstance *)&pid_speed_left, &config_left);
}
void motor_control_task(void)
{
float pwm_right = PIDCalculate((PIDInstance *)&pid_speed_right,motor_speed_right.value,motor_speed_right_ref);
float pwm_left = PIDCalculate((PIDInstance *)&pid_speed_left,motor_speed_left.value,motor_speed_left_ref);
motor_set_pwm_right(pwm_right);
motor_set_pwm_left(pwm_left);
}
void angle_control_init(float T)
{
PID_Init_Config_s config_yaw = {
.Kp = 1.0f,
.Ki = 0.0f,
.Kd = 0.0f,
.T = T,
.MaxOut = 25,
.Improve = PID_Yaw_Error_Corretion
};
PIDInit((PIDInstance *)&pid_yaw, &config_yaw);
}
void angle_control_task(void)
{
float speed_dif = PIDCalculate((PIDInstance *)&pid_yaw,imu_angle.yaw,yaw_ref);
motor_speed_left_ref = motor_speed_base - speed_dif;
motor_speed_right_ref = motor_speed_base + speed_dif;
}
void position_control_init(float T)
{
PID_Init_Config_s config_position = {
.Kp = 0.5f,
.Ki = 0.0f,
.Kd = 0.0f,
.T = T,
.MaxOut = 90,
};
PIDInit((PIDInstance *)&pid_position, &config_position);
}
void position_control_task(void)
{
//角度速率(单位度/秒)
angle_velocity = PIDCalculate((PIDInstance *)&pid_position,grayscale_sensor_position,0);
//发送给云台,角度速率前馈
command_send_angle_velocity((float*)&angle_velocity);
set_yaw_ref(yaw_ref + angle_velocity*pid_position.dt);
}
void set_yaw_ref(float set_value)
{
if(set_value>180)
{
while(set_value > 180)
set_value -= 360;
}
else if(set_value<-180)
{
while(set_value < -180)
set_value += 360;
}
yaw_ref = set_value;
}
+22
View File
@@ -0,0 +1,22 @@
#ifndef __TASK_H
#define __TASK_H
#include "zf_common_typedef.h"
void task_init(void);
//建议不直接修改此变量,而是通过set_yaw_ref(float set_value)设置,以防预期之外的值
extern volatile float yaw_ref;
void set_yaw_ref(float set_value);
//供外部控制使用
extern volatile uint8_t motor_control_task_enable;
extern volatile uint8_t angle_control_task_enable;
extern volatile uint8_t position_control_task_enable;
//配置项
/*自动模式下的基础直行速度*/
#define AUTO_MODE_BASE_SPEED 10
#endif
+443
View File
@@ -0,0 +1,443 @@
{
"configurations": [
{
"name": "SeekFree_MSPM0G3507_Device_Library",
"includePath": [
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\third_party\\CMSIS\\Core\\Include",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti_config",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_common",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_components",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_device",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\zf_driver",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\user\\inc",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\code",
"E:\\software\\ARM\\ARMCLANG\\include",
"E:\\software\\ARM\\ARMCLANG\\include\\arm_linux",
"E:\\software\\ARM\\ARMCLANG\\include\\arm_linux_compat",
"E:\\software\\ARM\\ARMCLANG\\include\\libcxx",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\project\\user\\src",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti\\driverlib",
"e:\\file\\AT2026\\SeekFree_MSPM0G3507_Opensource_Library\\libraries\\sdk\\ti\\driverlib\\m0p\\sysctl"
],
"defines": [
"__MSPM0G3507__",
"__alignof__(x)=",
"__asm(x)=",
"__asm__(x)=",
"__forceinline=",
"__restrict=",
"__volatile__=",
"__inline=",
"__inline__=",
"__declspec(x)=",
"__attribute__(x)=",
"__nonnull__(x)=",
"__unaligned=",
"__promise(x)=",
"__irq=",
"__swi=",
"__weak=",
"__register=",
"__pure=",
"__value_in_regs=",
"__breakpoint(x)=",
"__current_pc()=0U",
"__current_sp()=0U",
"__disable_fiq()=",
"__disable_irq()=",
"__enable_fiq()=",
"__enable_irq()=",
"__force_stores()=",
"__memory_changed()=",
"__schedule_barrier()=",
"__semihost(x,y)=0",
"__vfp_status(x,y)=0",
"__builtin_arm_nop()=",
"__builtin_arm_wfi()=",
"__builtin_arm_wfe()=",
"__builtin_arm_sev()=",
"__builtin_arm_sevl()=",
"__builtin_arm_yield()=",
"__builtin_arm_isb(x)=",
"__builtin_arm_dsb(x)=",
"__builtin_arm_dmb(x)=",
"__builtin_bswap32(x)=0U",
"__builtin_bswap16(x)=0U",
"__builtin_arm_rbit(x)=0U",
"__builtin_clz(x)=0U",
"__builtin_arm_ldrex(x)=0U",
"__builtin_arm_strex(x,y)=0U",
"__builtin_arm_clrex()=",
"__builtin_arm_ssat(x,y)=0U",
"__builtin_arm_usat(x,y)=0U",
"__builtin_arm_ldaex(x)=0U",
"__builtin_arm_stlex(x,y)=0U",
"_ILP32=1",
"_USE_STATIC_INLINE=1",
"__APCS_32__=1",
"__ARMCC_VERSION=6190004",
"__ARMCOMPILER_VERSION=6190004",
"__ARMEL__=1",
"__ARM_32BIT_STATE=1",
"__ARM_ACLE=200",
"__ARM_ARCH=4",
"__ARM_ARCH_4T__=1",
"__ARM_ARCH_ISA_ARM=1",
"__ARM_ARCH_ISA_THUMB=1",
"__ARM_EABI__=1",
"__ARM_FP16_ARGS=1",
"__ARM_FP16_FORMAT_IEEE=1",
"__ARM_NO_IMAGINARY_TYPE=1",
"__ARM_PCS=1",
"__ARM_PROMISE=__builtin_assume",
"__ARM_SIZEOF_MINIMAL_ENUM=4",
"__ARM_SIZEOF_WCHAR_T=4",
"__ARM_TARGET_COPROC=1",
"__ARM_TARGET_COPROC_V4=1",
"__ATOMIC_ACQUIRE=2",
"__ATOMIC_ACQ_REL=4",
"__ATOMIC_CONSUME=1",
"__ATOMIC_RELAXED=0",
"__ATOMIC_RELEASE=3",
"__ATOMIC_SEQ_CST=5",
"__BIGGEST_ALIGNMENT__=8",
"__BITINT_MAXWIDTH__=128",
"__BOOL_WIDTH__=8",
"__BYTE_ORDER__=__ORDER_LITTLE_ENDIAN__",
"__CHAR16_TYPE__=unsigned short",
"__CHAR32_TYPE__=unsigned int",
"__CHAR_BIT__=8",
"__CHAR_UNSIGNED__=1",
"__CLANG_ATOMIC_BOOL_LOCK_FREE=1",
"__CLANG_ATOMIC_CHAR16_T_LOCK_FREE=1",
"__CLANG_ATOMIC_CHAR32_T_LOCK_FREE=1",
"__CLANG_ATOMIC_CHAR_LOCK_FREE=1",
"__CLANG_ATOMIC_INT_LOCK_FREE=1",
"__CLANG_ATOMIC_LLONG_LOCK_FREE=1",
"__CLANG_ATOMIC_LONG_LOCK_FREE=1",
"__CLANG_ATOMIC_POINTER_LOCK_FREE=1",
"__CLANG_ATOMIC_SHORT_LOCK_FREE=1",
"__CLANG_ATOMIC_WCHAR_T_LOCK_FREE=1",
"__CONSTANT_CFSTRINGS__=1",
"__DBL_DECIMAL_DIG__=17",
"__DBL_DENORM_MIN__=4.9406564584124654e-324",
"__DBL_DIG__=15",
"__DBL_EPSILON__=2.2204460492503131e-16",
"__DBL_HAS_DENORM__=1",
"__DBL_HAS_INFINITY__=1",
"__DBL_HAS_QUIET_NAN__=1",
"__DBL_MANT_DIG__=53",
"__DBL_MAX_10_EXP__=308",
"__DBL_MAX_EXP__=1024",
"__DBL_MAX__=1.7976931348623157e+308",
"__DBL_MIN_10_EXP__=(-307)",
"__DBL_MIN_EXP__=(-1021)",
"__DBL_MIN__=2.2250738585072014e-308",
"__DECIMAL_DIG__=__LDBL_DECIMAL_DIG__",
"__ELF__=1",
"__ESCAPE__=",
"__FINITE_MATH_ONLY__=1",
"__FLT16_DECIMAL_DIG__=5",
"__FLT16_DENORM_MIN__=5.9604644775390625e-8F16",
"__FLT16_DIG__=3",
"__FLT16_EPSILON__=9.765625e-4F16",
"__FLT16_HAS_DENORM__=1",
"__FLT16_HAS_INFINITY__=1",
"__FLT16_HAS_QUIET_NAN__=1",
"__FLT16_MANT_DIG__=11",
"__FLT16_MAX_10_EXP__=4",
"__FLT16_MAX_EXP__=16",
"__FLT16_MAX__=6.5504e+4F16",
"__FLT16_MIN_10_EXP__=(-4)",
"__FLT16_MIN_EXP__=(-13)",
"__FLT16_MIN__=6.103515625e-5F16",
"__FLT_DECIMAL_DIG__=9",
"__FLT_DENORM_MIN__=1.40129846e-45F",
"__FLT_DIG__=6",
"__FLT_EPSILON__=1.19209290e-7F",
"__FLT_HAS_DENORM__=1",
"__FLT_HAS_INFINITY__=1",
"__FLT_HAS_QUIET_NAN__=1",
"__FLT_MANT_DIG__=24",
"__FLT_MAX_10_EXP__=38",
"__FLT_MAX_EXP__=128",
"__FLT_MAX__=3.40282347e+38F",
"__FLT_MIN_10_EXP__=(-37)",
"__FLT_MIN_EXP__=(-125)",
"__FLT_MIN__=1.17549435e-38F",
"__FLT_RADIX__=2",
"__GCC_ATOMIC_BOOL_LOCK_FREE=1",
"__GCC_ATOMIC_CHAR16_T_LOCK_FREE=1",
"__GCC_ATOMIC_CHAR32_T_LOCK_FREE=1",
"__GCC_ATOMIC_CHAR_LOCK_FREE=1",
"__GCC_ATOMIC_INT_LOCK_FREE=1",
"__GCC_ATOMIC_LLONG_LOCK_FREE=1",
"__GCC_ATOMIC_LONG_LOCK_FREE=1",
"__GCC_ATOMIC_POINTER_LOCK_FREE=1",
"__GCC_ATOMIC_SHORT_LOCK_FREE=1",
"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1",
"__GCC_ATOMIC_WCHAR_T_LOCK_FREE=1",
"__GNUC_MINOR__=2",
"__GNUC_PATCHLEVEL__=1",
"__GNUC_STDC_INLINE__=1",
"__GNUC__=4",
"__GXX_ABI_VERSION=1002",
"__ILP32__=1",
"__INT16_C_SUFFIX__=",
"__INT16_FMTd__=\"hd\"",
"__INT16_FMTi__=\"hi\"",
"__INT16_MAX__=32767",
"__INT16_TYPE__=short",
"__INT32_C_SUFFIX__=",
"__INT32_FMTd__=\"d\"",
"__INT32_FMTi__=\"i\"",
"__INT32_MAX__=2147483647",
"__INT32_TYPE__=int",
"__INT64_C_SUFFIX__=LL",
"__INT64_FMTd__=\"lld\"",
"__INT64_FMTi__=\"lli\"",
"__INT64_MAX__=9223372036854775807LL",
"__INT64_TYPE__=long long int",
"__INT8_C_SUFFIX__=",
"__INT8_FMTd__=\"hhd\"",
"__INT8_FMTi__=\"hhi\"",
"__INT8_MAX__=127",
"__INT8_TYPE__=signed char",
"__INTMAX_C_SUFFIX__=LL",
"__INTMAX_FMTd__=\"lld\"",
"__INTMAX_FMTi__=\"lli\"",
"__INTMAX_MAX__=9223372036854775807LL",
"__INTMAX_TYPE__=long long int",
"__INTMAX_WIDTH__=64",
"__INTPTR_FMTd__=\"d\"",
"__INTPTR_FMTi__=\"i\"",
"__INTPTR_MAX__=2147483647",
"__INTPTR_TYPE__=int",
"__INTPTR_WIDTH__=32",
"__INT_FAST16_FMTd__=\"hd\"",
"__INT_FAST16_FMTi__=\"hi\"",
"__INT_FAST16_MAX__=32767",
"__INT_FAST16_TYPE__=short",
"__INT_FAST16_WIDTH__=16",
"__INT_FAST32_FMTd__=\"d\"",
"__INT_FAST32_FMTi__=\"i\"",
"__INT_FAST32_MAX__=2147483647",
"__INT_FAST32_TYPE__=int",
"__INT_FAST32_WIDTH__=32",
"__INT_FAST64_FMTd__=\"lld\"",
"__INT_FAST64_FMTi__=\"lli\"",
"__INT_FAST64_MAX__=9223372036854775807LL",
"__INT_FAST64_TYPE__=long long int",
"__INT_FAST64_WIDTH__=64",
"__INT_FAST8_FMTd__=\"hhd\"",
"__INT_FAST8_FMTi__=\"hhi\"",
"__INT_FAST8_MAX__=127",
"__INT_FAST8_TYPE__=signed char",
"__INT_FAST8_WIDTH__=8",
"__INT_LEAST16_FMTd__=\"hd\"",
"__INT_LEAST16_FMTi__=\"hi\"",
"__INT_LEAST16_MAX__=32767",
"__INT_LEAST16_TYPE__=short",
"__INT_LEAST16_WIDTH__=16",
"__INT_LEAST32_FMTd__=\"d\"",
"__INT_LEAST32_FMTi__=\"i\"",
"__INT_LEAST32_MAX__=2147483647",
"__INT_LEAST32_TYPE__=int",
"__INT_LEAST32_WIDTH__=32",
"__INT_LEAST64_FMTd__=\"lld\"",
"__INT_LEAST64_FMTi__=\"lli\"",
"__INT_LEAST64_MAX__=9223372036854775807LL",
"__INT_LEAST64_TYPE__=long long int",
"__INT_LEAST64_WIDTH__=64",
"__INT_LEAST8_FMTd__=\"hhd\"",
"__INT_LEAST8_FMTi__=\"hhi\"",
"__INT_LEAST8_MAX__=127",
"__INT_LEAST8_TYPE__=signed char",
"__INT_LEAST8_WIDTH__=8",
"__INT_MAX__=2147483647",
"__INT_WIDTH__=32",
"__I__=1.0if",
"__LDBL_DECIMAL_DIG__=17",
"__LDBL_DENORM_MIN__=4.9406564584124654e-324L",
"__LDBL_DIG__=15",
"__LDBL_EPSILON__=2.2204460492503131e-16L",
"__LDBL_HAS_DENORM__=1",
"__LDBL_HAS_INFINITY__=1",
"__LDBL_HAS_QUIET_NAN__=1",
"__LDBL_MANT_DIG__=53",
"__LDBL_MAX_10_EXP__=308",
"__LDBL_MAX_EXP__=1024",
"__LDBL_MAX__=1.7976931348623157e+308L",
"__LDBL_MIN_10_EXP__=(-307)",
"__LDBL_MIN_EXP__=(-1021)",
"__LDBL_MIN__=2.2250738585072014e-308L",
"__LITTLE_ENDIAN__=1",
"__LLONG_WIDTH__=64",
"__LONG_LONG_MAX__=9223372036854775807LL",
"__LONG_MAX__=2147483647L",
"__LONG_WIDTH__=32",
"__NO_INLINE__=1",
"__OBJC_BOOL_IS_BOOL=0",
"__OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES=3",
"__OPENCL_MEMORY_SCOPE_DEVICE=2",
"__OPENCL_MEMORY_SCOPE_SUB_GROUP=4",
"__OPENCL_MEMORY_SCOPE_WORK_GROUP=1",
"__OPENCL_MEMORY_SCOPE_WORK_ITEM=0",
"__ORDER_BIG_ENDIAN__=4321",
"__ORDER_LITTLE_ENDIAN__=1234",
"__ORDER_PDP_ENDIAN__=3412",
"__POINTER_WIDTH__=32",
"__PRAGMA_REDEFINE_EXTNAME=1",
"__PTRDIFF_FMTd__=\"d\"",
"__PTRDIFF_FMTi__=\"i\"",
"__PTRDIFF_MAX__=2147483647",
"__PTRDIFF_TYPE__=int",
"__PTRDIFF_WIDTH__=32",
"__REGISTER_PREFIX__=",
"__SCHAR_MAX__=127",
"__SHRT_MAX__=32767",
"__SHRT_WIDTH__=16",
"__SIG_ATOMIC_MAX__=2147483647",
"__SIG_ATOMIC_WIDTH__=32",
"__SIZEOF_DOUBLE__=8",
"__SIZEOF_FLOAT__=4",
"__SIZEOF_INT__=4",
"__SIZEOF_LONG_DOUBLE__=8",
"__SIZEOF_LONG_LONG__=8",
"__SIZEOF_LONG__=4",
"__SIZEOF_POINTER__=4",
"__SIZEOF_PTRDIFF_T__=4",
"__SIZEOF_SHORT__=2",
"__SIZEOF_SIZE_T__=4",
"__SIZEOF_WCHAR_T__=4",
"__SIZEOF_WINT_T__=4",
"__SIZE_FMTX__=\"X\"",
"__SIZE_FMTo__=\"o\"",
"__SIZE_FMTu__=\"u\"",
"__SIZE_FMTx__=\"x\"",
"__SIZE_MAX__=4294967295U",
"__SIZE_TYPE__=unsigned int",
"__SIZE_WIDTH__=32",
"__STDC_HOSTED__=1",
"__STDC_UTF_16__=1",
"__STDC_UTF_32__=1",
"__STDC_VERSION__=201710L",
"__STDC__=1",
"__UINT16_C_SUFFIX__=",
"__UINT16_FMTX__=\"hX\"",
"__UINT16_FMTo__=\"ho\"",
"__UINT16_FMTu__=\"hu\"",
"__UINT16_FMTx__=\"hx\"",
"__UINT16_MAX__=65535",
"__UINT16_TYPE__=unsigned short",
"__UINT32_C_SUFFIX__=U",
"__UINT32_FMTX__=\"X\"",
"__UINT32_FMTo__=\"o\"",
"__UINT32_FMTu__=\"u\"",
"__UINT32_FMTx__=\"x\"",
"__UINT32_MAX__=4294967295U",
"__UINT32_TYPE__=unsigned int",
"__UINT64_C_SUFFIX__=ULL",
"__UINT64_FMTX__=\"llX\"",
"__UINT64_FMTo__=\"llo\"",
"__UINT64_FMTu__=\"llu\"",
"__UINT64_FMTx__=\"llx\"",
"__UINT64_MAX__=18446744073709551615ULL",
"__UINT64_TYPE__=long long unsigned int",
"__UINT8_C_SUFFIX__=",
"__UINT8_FMTX__=\"hhX\"",
"__UINT8_FMTo__=\"hho\"",
"__UINT8_FMTu__=\"hhu\"",
"__UINT8_FMTx__=\"hhx\"",
"__UINT8_MAX__=255",
"__UINT8_TYPE__=unsigned char",
"__UINTMAX_C_SUFFIX__=ULL",
"__UINTMAX_FMTX__=\"llX\"",
"__UINTMAX_FMTo__=\"llo\"",
"__UINTMAX_FMTu__=\"llu\"",
"__UINTMAX_FMTx__=\"llx\"",
"__UINTMAX_MAX__=18446744073709551615ULL",
"__UINTMAX_TYPE__=long long unsigned int",
"__UINTMAX_WIDTH__=64",
"__UINTPTR_FMTX__=\"X\"",
"__UINTPTR_FMTo__=\"o\"",
"__UINTPTR_FMTu__=\"u\"",
"__UINTPTR_FMTx__=\"x\"",
"__UINTPTR_MAX__=4294967295U",
"__UINTPTR_TYPE__=unsigned int",
"__UINTPTR_WIDTH__=32",
"__UINT_FAST16_FMTX__=\"hX\"",
"__UINT_FAST16_FMTo__=\"ho\"",
"__UINT_FAST16_FMTu__=\"hu\"",
"__UINT_FAST16_FMTx__=\"hx\"",
"__UINT_FAST16_MAX__=65535",
"__UINT_FAST16_TYPE__=unsigned short",
"__UINT_FAST32_FMTX__=\"X\"",
"__UINT_FAST32_FMTo__=\"o\"",
"__UINT_FAST32_FMTu__=\"u\"",
"__UINT_FAST32_FMTx__=\"x\"",
"__UINT_FAST32_MAX__=4294967295U",
"__UINT_FAST32_TYPE__=unsigned int",
"__UINT_FAST64_FMTX__=\"llX\"",
"__UINT_FAST64_FMTo__=\"llo\"",
"__UINT_FAST64_FMTu__=\"llu\"",
"__UINT_FAST64_FMTx__=\"llx\"",
"__UINT_FAST64_MAX__=18446744073709551615ULL",
"__UINT_FAST64_TYPE__=long long unsigned int",
"__UINT_FAST8_FMTX__=\"hhX\"",
"__UINT_FAST8_FMTo__=\"hho\"",
"__UINT_FAST8_FMTu__=\"hhu\"",
"__UINT_FAST8_FMTx__=\"hhx\"",
"__UINT_FAST8_MAX__=255",
"__UINT_FAST8_TYPE__=unsigned char",
"__UINT_LEAST16_FMTX__=\"hX\"",
"__UINT_LEAST16_FMTo__=\"ho\"",
"__UINT_LEAST16_FMTu__=\"hu\"",
"__UINT_LEAST16_FMTx__=\"hx\"",
"__UINT_LEAST16_MAX__=65535",
"__UINT_LEAST16_TYPE__=unsigned short",
"__UINT_LEAST32_FMTX__=\"X\"",
"__UINT_LEAST32_FMTo__=\"o\"",
"__UINT_LEAST32_FMTu__=\"u\"",
"__UINT_LEAST32_FMTx__=\"x\"",
"__UINT_LEAST32_MAX__=4294967295U",
"__UINT_LEAST32_TYPE__=unsigned int",
"__UINT_LEAST64_FMTX__=\"llX\"",
"__UINT_LEAST64_FMTo__=\"llo\"",
"__UINT_LEAST64_FMTu__=\"llu\"",
"__UINT_LEAST64_FMTx__=\"llx\"",
"__UINT_LEAST64_MAX__=18446744073709551615ULL",
"__UINT_LEAST64_TYPE__=long long unsigned int",
"__UINT_LEAST8_FMTX__=\"hhX\"",
"__UINT_LEAST8_FMTo__=\"hho\"",
"__UINT_LEAST8_FMTu__=\"hhu\"",
"__UINT_LEAST8_FMTx__=\"hhx\"",
"__UINT_LEAST8_MAX__=255",
"__UINT_LEAST8_TYPE__=unsigned char",
"__USER_LABEL_PREFIX__=",
"__VERSION__=\"Clang 16.0.0\"",
"__VFP_FP__=1",
"__WCHAR_MAX__=4294967295U",
"__WCHAR_TYPE__=unsigned int",
"__WCHAR_UNSIGNED__=1",
"__WCHAR_WIDTH__=32",
"__WINT_MAX__=2147483647",
"__WINT_TYPE__=int",
"__WINT_WIDTH__=32",
"__arm=1",
"__arm__=1",
"__clang__=1",
"__clang_literal_encoding__=\"UTF-8\"",
"__clang_major__=16",
"__clang_minor__=0",
"__clang_patchlevel__=0",
"__clang_version__=\"16.0.0 \"",
"__clang_wide_literal_encoding__=\"UTF-32\"",
"__llvm__=1"
],
"intelliSenseMode": "${default}"
}
],
"version": 4
}
File diff suppressed because one or more lines are too long
@@ -487,7 +487,7 @@
<Group> <Group>
<GroupName>zf_driver</GroupName> <GroupName>zf_driver</GroupName>
<tvExp>0</tvExp> <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
@@ -1227,6 +1227,222 @@
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\GrayscaleSensor.c</PathWithFileName>
<FilenameWithoutPath>GrayscaleSensor.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\ICM_42688.c</PathWithFileName>
<FilenameWithoutPath>ICM_42688.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\IMU.c</PathWithFileName>
<FilenameWithoutPath>IMU.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\Motor.c</PathWithFileName>
<FilenameWithoutPath>Motor.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\MotorEncoder.c</PathWithFileName>
<FilenameWithoutPath>MotorEncoder.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>87</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\GrayscaleSensor.h</PathWithFileName>
<FilenameWithoutPath>GrayscaleSensor.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>88</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\ICM_42688.h</PathWithFileName>
<FilenameWithoutPath>ICM_42688.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>89</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\IMU.h</PathWithFileName>
<FilenameWithoutPath>IMU.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>90</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\Motor.h</PathWithFileName>
<FilenameWithoutPath>Motor.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>91</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\MotorEncoder.h</PathWithFileName>
<FilenameWithoutPath>MotorEncoder.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>92</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\Task.c</PathWithFileName>
<FilenameWithoutPath>Task.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>93</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\Task.h</PathWithFileName>
<FilenameWithoutPath>Task.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>94</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\Beep.c</PathWithFileName>
<FilenameWithoutPath>Beep.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>95</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\Beep.h</PathWithFileName>
<FilenameWithoutPath>Beep.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>96</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\PID_Controller.c</PathWithFileName>
<FilenameWithoutPath>PID_Controller.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>97</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\PID_Controller.h</PathWithFileName>
<FilenameWithoutPath>PID_Controller.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>98</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\Command.c</PathWithFileName>
<FilenameWithoutPath>Command.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>99</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\code\Command.h</PathWithFileName>
<FilenameWithoutPath>Command.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>
@@ -1237,7 +1453,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>82</FileNumber> <FileNumber>100</FileNumber>
<FileType>2</FileType> <FileType>2</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1249,7 +1465,7 @@
</File> </File>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>83</FileNumber> <FileNumber>101</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1261,7 +1477,7 @@
</File> </File>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>84</FileNumber> <FileNumber>102</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1275,13 +1491,13 @@
<Group> <Group>
<GroupName>Driverlib</GroupName> <GroupName>Driverlib</GroupName>
<tvExp>0</tvExp> <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>85</FileNumber> <FileNumber>103</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1293,7 +1509,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>86</FileNumber> <FileNumber>104</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1305,7 +1521,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>87</FileNumber> <FileNumber>105</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1317,7 +1533,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>88</FileNumber> <FileNumber>106</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1329,7 +1545,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>89</FileNumber> <FileNumber>107</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1341,7 +1557,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>90</FileNumber> <FileNumber>108</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1353,7 +1569,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>91</FileNumber> <FileNumber>109</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1365,7 +1581,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>92</FileNumber> <FileNumber>110</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1377,7 +1593,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>93</FileNumber> <FileNumber>111</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1389,7 +1605,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>94</FileNumber> <FileNumber>112</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1401,7 +1617,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>95</FileNumber> <FileNumber>113</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1413,7 +1629,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>96</FileNumber> <FileNumber>114</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1425,7 +1641,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>97</FileNumber> <FileNumber>115</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1437,7 +1653,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>98</FileNumber> <FileNumber>116</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1449,7 +1665,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>99</FileNumber> <FileNumber>117</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1461,7 +1677,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>100</FileNumber> <FileNumber>118</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1473,7 +1689,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>101</FileNumber> <FileNumber>119</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1485,7 +1701,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>102</FileNumber> <FileNumber>120</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1497,7 +1713,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>103</FileNumber> <FileNumber>121</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1509,7 +1725,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>104</FileNumber> <FileNumber>122</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1521,7 +1737,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>105</FileNumber> <FileNumber>123</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1533,7 +1749,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>106</FileNumber> <FileNumber>124</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1545,7 +1761,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>107</FileNumber> <FileNumber>125</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1557,7 +1773,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>108</FileNumber> <FileNumber>126</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1569,7 +1785,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>109</FileNumber> <FileNumber>127</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1581,7 +1797,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>110</FileNumber> <FileNumber>128</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1593,7 +1809,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>111</FileNumber> <FileNumber>129</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1605,7 +1821,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>112</FileNumber> <FileNumber>130</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1617,7 +1833,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>113</FileNumber> <FileNumber>131</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1629,7 +1845,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>114</FileNumber> <FileNumber>132</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1641,7 +1857,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>115</FileNumber> <FileNumber>133</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1653,7 +1869,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>116</FileNumber> <FileNumber>134</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1665,7 +1881,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>117</FileNumber> <FileNumber>135</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1677,7 +1893,7 @@
</File> </File>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>118</FileNumber> <FileNumber>136</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@@ -1687,6 +1903,18 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>137</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\libraries\sdk\ti\driverlib\m0p\sysctl\dl_sysctl_mspm0g1x0x_g3x0x.c</PathWithFileName>
<FilenameWithoutPath>dl_sysctl_mspm0g1x0x_g3x0x.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
</ProjectOpt> </ProjectOpt>
@@ -813,6 +813,98 @@
</Group> </Group>
<Group> <Group>
<GroupName>code</GroupName> <GroupName>code</GroupName>
<Files>
<File>
<FileName>GrayscaleSensor.c</FileName>
<FileType>1</FileType>
<FilePath>..\code\GrayscaleSensor.c</FilePath>
</File>
<File>
<FileName>ICM_42688.c</FileName>
<FileType>1</FileType>
<FilePath>..\code\ICM_42688.c</FilePath>
</File>
<File>
<FileName>IMU.c</FileName>
<FileType>1</FileType>
<FilePath>..\code\IMU.c</FilePath>
</File>
<File>
<FileName>Motor.c</FileName>
<FileType>1</FileType>
<FilePath>..\code\Motor.c</FilePath>
</File>
<File>
<FileName>MotorEncoder.c</FileName>
<FileType>1</FileType>
<FilePath>..\code\MotorEncoder.c</FilePath>
</File>
<File>
<FileName>GrayscaleSensor.h</FileName>
<FileType>5</FileType>
<FilePath>..\code\GrayscaleSensor.h</FilePath>
</File>
<File>
<FileName>ICM_42688.h</FileName>
<FileType>5</FileType>
<FilePath>..\code\ICM_42688.h</FilePath>
</File>
<File>
<FileName>IMU.h</FileName>
<FileType>5</FileType>
<FilePath>..\code\IMU.h</FilePath>
</File>
<File>
<FileName>Motor.h</FileName>
<FileType>5</FileType>
<FilePath>..\code\Motor.h</FilePath>
</File>
<File>
<FileName>MotorEncoder.h</FileName>
<FileType>5</FileType>
<FilePath>..\code\MotorEncoder.h</FilePath>
</File>
<File>
<FileName>Task.c</FileName>
<FileType>1</FileType>
<FilePath>..\code\Task.c</FilePath>
</File>
<File>
<FileName>Task.h</FileName>
<FileType>5</FileType>
<FilePath>..\code\Task.h</FilePath>
</File>
<File>
<FileName>Beep.c</FileName>
<FileType>1</FileType>
<FilePath>..\code\Beep.c</FilePath>
</File>
<File>
<FileName>Beep.h</FileName>
<FileType>5</FileType>
<FilePath>..\code\Beep.h</FilePath>
</File>
<File>
<FileName>PID_Controller.c</FileName>
<FileType>1</FileType>
<FilePath>..\code\PID_Controller.c</FilePath>
</File>
<File>
<FileName>PID_Controller.h</FileName>
<FileType>5</FileType>
<FilePath>..\code\PID_Controller.h</FilePath>
</File>
<File>
<FileName>Command.c</FileName>
<FileType>1</FileType>
<FilePath>..\code\Command.c</FilePath>
</File>
<File>
<FileName>Command.h</FileName>
<FileType>5</FileType>
<FilePath>..\code\Command.h</FilePath>
</File>
</Files>
</Group> </Group>
<Group> <Group>
<GroupName>ti_config</GroupName> <GroupName>ti_config</GroupName>
@@ -1007,6 +1099,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\..\libraries\sdk\ti\driverlib\dl_wwdt.c</FilePath> <FilePath>..\..\libraries\sdk\ti\driverlib\dl_wwdt.c</FilePath>
</File> </File>
<File>
<FileName>dl_sysctl_mspm0g1x0x_g3x0x.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\libraries\sdk\ti\driverlib\m0p\sysctl\dl_sysctl_mspm0g1x0x_g3x0x.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
</Groups> </Groups>
+65 -3
View File
@@ -39,20 +39,82 @@
// 本例程是开源库空工程 可用作移植或者测试各类内外设 // 本例程是开源库空工程 可用作移植或者测试各类内外设
// **************************** 代码区域 **************************** // **************************** 代码区域 ****************************
#include "Motor.h"
#include "zf_device_key.h"
#include "Task.h"
#include "IMU.h"
#include "Beep.h"
#include "GrayscaleSensor.h"
#include "MotorEncoder.h"
/*
定时器资源分配:
G0 右电机PWM
G7 左电机PWM
A0 100Hz任务
A1 50Hz任务
G6 20Hz任务
*/
/*
中断等级分配:
0 GPIOA_INT_IRQn 外部中断模拟四倍频正交编码器
1 TIMA0_INT_IRQn 100Hz任务
1 TIMA1_INT_IRQn 50Hz任务
1 UART2_INT_IRQn Command串口接收中断
7 TIMG6_INT_IRQn 20Hz任务
*/
int main (void) int main (void)
{ {
clock_init(SYSTEM_CLOCK_80M); // 时钟配置及系统初始化<务必保留> clock_init(SYSTEM_CLOCK_80M); // 时钟配置及系统初始化<务必保留>
debug_init(); // 调试串口信息初始化 debug_init(); // 调试串口信息初始化
// 此处编写用户代码 例如外设初始化代码等 // 此处编写用户代码 例如外设初始化代码等
beep_init(50);
motor_init();
key_init(50);//按键初始化,参数为扫描周期50ms
imu_init(200);// IMU 初始化,参数为采样频率 200Hz 需要与定时器中断频率一致
imu_calibrate_gyro(); // IMU 陀螺仪零偏校准 需要在静止状态下调用
grayscale_sensor_init();//灰度传感器初始化
motor_encoder_init();//电机编码器初始化
task_init();
beep_on_time(500);//初始化完成,蜂鸣器响 500ms
// 此处编写用户代码 例如外设初始化代码等 // 此处编写用户代码 例如外设初始化代码等
while(true) while(1)
{ {
// 此处编写需要循环执行的代码 // 此处编写需要循环执行的代码
system_delay_ms(100);
char str[20] = {0};
sprintf(str,"%d,%d,%d\n", (int)(imu_angle.yaw*100),(int)(yaw_ref*100),(int)(grayscale_sensor_position*100));
debug_send_buffer((const uint8 *)str,strlen(str));
if(KEY_SHORT_PRESS == key_get_state(KEY_1))
{
while(KEY_SHORT_PRESS == key_get_state(KEY_1));
// 等待按键释放
grayscale_sensor_set_white();
beep_on_time(200);
}
else if(KEY_SHORT_PRESS == key_get_state(KEY_2))
{
while(KEY_SHORT_PRESS == key_get_state(KEY_2));
// 等待按键释放
grayscale_sensor_set_black();
beep_on_time(200);
}
else if(KEY_SHORT_PRESS == key_get_state(KEY_3))
{
while(KEY_SHORT_PRESS == key_get_state(KEY_3));
// 等待按键释放
set_yaw_ref(yaw_ref + 5.0f);
beep_on_time(200);
}
else if(KEY_SHORT_PRESS == key_get_state(KEY_4))
{
while(KEY_SHORT_PRESS == key_get_state(KEY_4));
// 等待按键释放
set_yaw_ref(yaw_ref - 5.0f);
beep_on_time(200);
}
// 此处编写需要循环执行的代码 // 此处编写需要循环执行的代码
} }
+11
View File
@@ -0,0 +1,11 @@
尽量不要使用以下引脚,以下引脚属于特殊功能引脚,使用可能会导致核心板异常。
因此建议大家尽量不要使用。
A23
A21
A19
A20
A5
A6
A4
A3
-11
View File
@@ -1,11 +0,0 @@
尽量不要使用以下引脚,以下引脚属于特殊功能引脚,使用可能会导致核心板异常。
因此建议大家尽量不要使用。
A23
A21
A19
A20
A5
A6
A4
A3