STC单片机驱动BLDC无刷直流电机(无HALL)官方示例
- 示例代码在
STC8系列
第20章文档:http://www.stcmcudata.com/STC8F-DATASHEET/STC8H.pdf
如果文档数据中的驱动代码直接复制到新工厂项目中,则直接编译将报告错误。主要原因是使用的头文件与包含的头文件中的一些特殊功能寄存器没有定义。这只能表明官方头文件没有及时更新,内部使用的头文件已经存在,发布的头文件没有更新,另一个原因是头文件的使用规范。给出的示例代码中包含的头文件是
STC8H8K.h
,在Keil可以加载的系列头文件STC8.H
,stc8h.h
- 这是Keil所有可以在目录下看到的目录STC给出的头文件
所以我怀疑官方资料案例中使用的头文件
STC8H8K.h
它应该是内部的。当您复制文档中的示例代码进行编译时,您将找不到各种寄存器定义的错误报告。(STC是不是分工不均,做文档资料1000页的人很多,没有人做技术底层的文档资料。STC阅读下一个单片机型号的文档,我怀疑一份没有1000页内容的信息是否没有成功下载)
程序代码说明
我不会发布编译未通过的代码。这里发布的是从另一个工具中复制的没有问题的编译代码,但也需要更改。否则,编译报错的主要原因是定义的结构没有初始化,怀疑错过了一行,
TIM_TypeDef *TIM1,*TIM2;
我也怀疑代码是否可以使用,因为它被使用了TIM1
和TIM2
,这两个结构体的变量来自一个结构体,其次是后面给出的#define TIM1_BaseAddress 0xFEC0 #define TIM2_BaseAddress 0xFEE0
我没有看到它的使用。我在结构一句新话。TIM_TypeDef *TIM1,*TIM2;
结构体的初始化。
- 代码源工具:STCcube单片机工具
下载地址:
https://www.stcisp.com/stccube/stccube.zip
- 根据以下信息下载工具的相关信息。(https://www.stcisp.com/)
-全部代码
//BLDC无刷直流电机驱动(无刷直流电机驱动(无刷直流电机驱动)HALL)///测试工作频率为11.0592MHz//本例程实现以下功能: 3组PWM无霍尔马达的通道控制//本例程仅适用于577BL02马达在24V无负载演示#include "stc8h.h"#include "intrins.h"typedef unsigned char u8;typedef unsigned int u16;typedef struct TIM_struct{ volatile unsigned char CR1; /*!< control register 1 */ volatile unsigned char CR2; /*!< control register 2 */ volatile unsigned char SMCR; /*!< Synchro mode control register */ volatile unsigned char ETR; /*!< external trigger register */ volatile unsigned char IER; /*!< interrupt enable register*/ volatile unsigned char SR1; /*!< status register 1 */ volatile unsigned char SR2; /*!< status register 2 */ volatile unsigned char EGR; /*!< event generation register */ volatile unsigned char CCMR1; /*!< CC mode register 1 */ volatile unsigned char CCMR2; /*!< CC mode register 2 */ volatile unsigned char CCMR3; /*!< CC mode register 3 */ volatile unsigned char CCMR4; /*!< CC mode register 4 */ volatile unsigned char CCER1; /*!< CC enable register 1 */ volatile unsigned char CCER2; /*!< CC enable register 2 */ volatile unsigned char CNTRH; /*!< counter high */ volatile unsigned char CNTRL; /*!< counter low */ volatile unsigned char PSCRH; /*!< prescaler high */ volatile unsigned char PSCRL; /*!< prescaler low */ volatile unsigned char ARRH; /*!< auto-reload register high */ volatile unsigned char ARRL; /*!< auto-reload register low */ volatile unsigned char RCR; /*!< Repetition Counter register */ volatile unsigned char CCR1H; /*!< capture/compare register 1 high */ volatile unsigned char CCR1L; /*!< capture/compare register 1 low */ volatile unsigned char CCR2H; /*!< capture/compare register 2 high */ volatile unsigned char CCR2L; /*!< capture/compare register 2 low */ volatile unsigned char CCR3H; /*!< capture/compare register 3 high */ volatile unsigned char CCR3L; /*!< capture/compare register 3 low */ volatile unsigned char CCR4H; /*!< capture/compare register 3 high */ volatile unsigned char CCR4L; /*!< capture/compare register 3 low */ volatile unsigned char BKR; /*!< Break Register */ volatile unsigned char DTR; /*!< dead-time register */ volatile unsigned char OISR; /*!< Output idle register */}TIM_TypeDef;TIM_TypeDef *TIM1,*TIM2;#define TIM1_BaseAddress 0xFEC0#define TIM2_BaseAddress 0xFEE0#define TRUE 1#define FALSE 0#define RV09_CH 6#define TIM1_Period ((u16)280)#define TIM1_STPulse ((u16)245)#define START 0x1A#define RUN 0x1B#define STOP 0x1C#define IDLE 0x1D#define TIM1_OCMODE_MASK ((u8)0x70)#define TIM1_OCCE_ENABLE ((u8)0x80)#define TIM1_OCCE_DISABLE ((u8)0x00)#define TIM1_OCMODE_TIMING ((u8)0x00)#define TIM1_OCMODE_ACTIVE ((u8)0x10)#define TIM1_OCMODE_INACTIVE ((u8)0x20)#define TIM1_OCMODE_TOGGLE ((u8)0x30)#define TIM1_FORCE_INACTIVE ((u8)0x40)#define TIM1_FORCE_ACTIVE ((u8)0x50)#define TIM1_OCMODE_PWMA ((u8)0x60)#define TIM1_OCMODE_PWMB ((u8)0x70)#define CC1_POLARITY_HIGH ((u8)0x02)#define CC1N_POLARITY_HIGH ((u8)0x08)#define CC2_POLARITY_HIGH ((u8)0x20)#define CC2N_POLARITY_HIGH ((u8)0x80)#define CC1_POLARITY_LOW ((u8)~0x02)#define CC1N_POLARITY_LOW ((u8)~0x08)#define CC2_POLARITY_LOW ((u8)~0x20)#define CC2N_POLARITY_LOW ((u8)~0x80)#define CC1_OCENABLE ((u8)0x01)#define CC1N_OCENABLE ((u8)0x04)#define CC2_OCENABLE ((u8)0x10)#define CC2N_OCENABLE ((u8)0x40)#define CC1_OCDISABLE ((u8)~0x01)#define CC1N_OCDISABLE ((u8)~0x04)#define CC2_OCDISABLE ((u8)~0x10)#define CC2N_OCDISABLE ((u8)~0x40)#define CC3_POLARITY_HIGH ((u8)0x02)#define CC3N_POLARITY_HIGH