STC15W408AS电调程序芯片解密
- 芯片解密本程序试验使用STC15W408AS来驱动航模用的无感无刷三相直流马达.
- 芯片解密
- 芯片解密电路图见文件 "BLDC-V10-实验电路.pdf".
- 芯片解密控制信号由P3.2输入正脉冲信号, 间隔5~20ms, 脉冲宽度1.000~1.610ms.
- 芯片解密1.160ms开始启动, 1.610ms为最高速度, 分辨率为2us.
- 芯片解密本程序仅仅是简单控制, 软件没有处理过0延时30度切换和过流检测.
- 由于过0检测部分有RC滤波, 所以改变电容值可以大约的对应在最高速时延时30度的时间.
- 有意者可自行完善电路和程序.
- *********************************************************************************/
- #define MAIN_Fosc 24000000L //定义主时钟
- #include "STC15Fxxxx.H"
- //CMPCR1(比较器控制寄存器 1)
- #define CMPEN 0x80 //1: 允许比较器, 0: 禁止,关闭比较器电源
- #define CMPIF 0x40 //比较器中断标志, 包括上升沿或下降沿中断, 软件清0
- #define PIE 0x20 //1: 比较结果由0变1, 产生上升沿中断
- #define NIE 0x10 //1: 比较结果由1变0, 产生下降沿中断
- #define PIS 0x08 //输入正极性选择, 0: 选择外部P5.5做正输入, 1: 由ADCIS[2:0]所选择的ADC输入端做正输入.
- #define NIS 0x04 //输入负极性选择, 0: 选择内部BandGap电压BGv做负输入, 1: 选择外部P5.4做输入.
- #define CMPOE 0x02 //1: 允许比较结果输出到P1.2, 0: 禁止.
- #define CMPRES 0x01 //比较结果, 1: CMP+电平高于CMP-, 0: CMP+电平低于CMP-, 只读
- //CMPCR2(比较器控制寄存器 2)
- #define INVCMPO 0x80 //1: 比较器输出取反, 0: 不取反
- #define DISFLT 0x40 //1: 关闭0.1us滤波, 0: 允许
- #define LCDTY 0x00 //关闭数字滤波功能. 数字滤波功能即为数字信号去抖动功能.
- sbit PWM0_L = P3^4;
- sbit PWM1_L = P3^5;
- sbit PWM2_L = P3^6;
- u8 Step;
- u8 PWM_Value; // 决定PWM占空比的值
- u16 RxPulseWide;
- bit B_RxOk; //定义一个bool量.
- bit B_RUN;
- u8 PWW_Set;
- u8 cnt10ms;
- u8 Rx_cnt;
- u8 TimeOut; //堵转超时
- #define DISABLE_CMP_INT CMPCR1 &= ~0X40 // 比较器中断标志位清0.
- #define ENABLE_CMP_INT CMPCR1 |= 0X40 // 比较器中断标志位置1.
- /*********************************************************************/
- void Delay_n_ms(u8 dly)
- {
- u16 j;
- do
- {
- j = MAIN_Fosc / 13000; //延时1ms, 主程序在此节拍下运行
- while(--j) ;
- }
- while(--dly);
- }
- void delay_us(u8 us)
- {
- do
- {
- NOP(20); //@24MHz
- }
- while(--us);
- }
- void StepXL(void) // 换相序列函数
- {
- switch(Step)
- {
- case 0: // AB
- PWM0_L=0; PWM1_L = 1; PWM2_L=0; // Q4常开.
- CCAP0H = PWM_Value; CCAP1H=0; CCAP2H=0; // A相由占空比控制.
- ADC_CONTR = 0XCD; // ADC电源开,ADC转换开,选择P1.5作为ADC输入口
- CMPCR1 = 0x9C; // 比较器使能, 下降沿中断允许,通过ADC的P1.5口作为比较器的正极输入端,
- //选择外部端口P5.4作为比较器负极输入端.
- break;
- case 1: // AC
- PWM0_L=0; PWM1_L=0; PWM2_L = 1; // Q4常开
- CCAP0H = PWM_Value; CCAP1H=0; CCAP2H=0; // A相由占空比控制.
- ADC_CONTR = 0XCC; // ADC电源开,ADC转换开,选择P1.4作为ADC输入端
- CMPCR1 = 0xAC; // 比较器使能, 上升沿中断允许,通过ADC的P1.4口作为比较器的正极输入端
- //选择外部端口P5.4作为比较器负极输入端.
- break;
- case 2: // BC
- PWM0_L=0; PWM1_L=0; PWM2_L = 1; // Q2常开
- CCAP0H=0; CCAP2H=0; CCAP1H = PWM_Value; // B相由占空比控制.
- ADC_CONTR = 0XCB; // ADC电源开,ADC转换开,选择P1.3作为ADC输入口测量A点电压
- CMPCR1 = 0x9C; // 比较器使能, 下降沿中断允许,通过ADC的P1.3口作为比较器的正极输入端
- //选择外部端口P5.4作为比较器负极输入端.
- break;
- case 3: // BA
- PWM0_L = 1; PWM1_L=0; PWM2_L=0; // Q6常开
- CCAP0H=0; CCAP2H=0; CCAP1H = PWM_Value; // B相由占空比控制.
- ADC_CONTR = 0XCD; // ADC电源开,ADC转换开,选择P1.5作为ADC输入口测量C点电压
- CMPCR1 = 0xAC; // 比较器使能, 上升沿中断允许,通过ADC的P1.5口作为比较器的正极输入端
- //选择外部端口P5.4作为比较器负极输入端.
- break;
- case 4: // CA
- PWM0_L = 1; PWM1_L=0; PWM2_L=0; // Q6常开
- CCAP0H=0; CCAP1H=0; CCAP2H = PWM_Value; // C相由占空比控制.
- ADC_CONTR = 0XCC; // ADC电源开,ADC转换开,选择P1.4作为ADC输入口测量B点电压
- CMPCR1 = 0x9C; // 比较器使能, 下降沿中断允许,通过ADC的P1.4口作为比较器的正极输入端
- //选择外部端口P5.4作为比较器负极输入端.
- break;
- case 5: // CB
- PWM0_L=0; PWM2_L=0; PWM1_L = 1; // Q4常开
- CCAP0H=0; CCAP1H=0; CCAP2H = PWM_Value; // C相由占空比控制.
- ADC_CONTR = 0XCB; // ADC电源开,ADC转换开,选择P1.3作为ADC输入口测量A点电压
- CMPCR1 = 0xAC; // 比较器使能, 上升沿中断允许,通过ADC的P1.3口作为比较器的正极输入端
- //选择外部端口P5.4作为比较器负极输入端.
- break;
- default:
- break;
- }
- }

芯片解密