init:全链路闭环控制调通
This commit is contained in:
+10
@@ -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
|
||||||
Vendored
+443
@@ -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
|
||||||
|
}
|
||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"C_Cpp.errorSquiggles": "disabled",
|
||||||
|
"C_Cpp.default.compilerPath": ""
|
||||||
|
}
|
||||||
@@ -5,6 +5,12 @@
|
|||||||
* @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.
|
||||||
@@ -12,9 +18,12 @@
|
|||||||
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 QEI = scripting.addModule("/ti/driverlib/QEI", {}, false);
|
||||||
|
const QEI1 = QEI.addInstance();
|
||||||
const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL");
|
const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL");
|
||||||
const SYSTICK = scripting.addModule("/ti/driverlib/SYSTICK");
|
const SYSTICK = scripting.addModule("/ti/driverlib/SYSTICK");
|
||||||
const VREF = scripting.addModule("/ti/driverlib/VREF");
|
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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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]);
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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占空比
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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; // 读取后清零
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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
@@ -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
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
// 此处编写需要循环执行的代码
|
// 此处编写需要循环执行的代码
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
尽量不要使用以下引脚,以下引脚属于特殊功能引脚,使用可能会导致核心板异常。
|
||||||
|
因此建议大家尽量不要使用。
|
||||||
|
A23
|
||||||
|
A21
|
||||||
|
A19
|
||||||
|
A20
|
||||||
|
A5
|
||||||
|
A6
|
||||||
|
A4
|
||||||
|
A3
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
|
|
||||||
尽量不要使用以下引脚,以下引脚属于特殊功能引脚,使用可能会导致核心板异常。
|
|
||||||
因此建议大家尽量不要使用。
|
|
||||||
A23
|
|
||||||
A21
|
|
||||||
A19
|
|
||||||
A20
|
|
||||||
A5
|
|
||||||
A6
|
|
||||||
A4
|
|
||||||
A3
|
|
||||||
Reference in New Issue
Block a user