找回密码
 立即注册
楼主: lyagp03

无刷电机转动问题

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:584
  • 最近打卡:2025-10-15 08:26:15
已绑定手机

86

主题

6274

回帖

1万

积分

超级版主

积分
11734
发表于 2025-9-17 22:37:13 | 显示全部楼层
Debu*** 发表于 2025-9-17 22:33
任意一相对地电压和三路给比较器的电压,这应该是给比较器的电压超出范围了,减小R14、R15、R16试一下, ...

最大约2K,2K是分压到约4.12V

点评

不使用ADC,仅用比较器,1.5K就可以,上8.2K下1.5K,支持最高电源电压约30V  详情 回复 发表于 2025-9-17 22:39
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:584
  • 最近打卡:2025-10-15 08:26:15
已绑定手机

86

主题

6274

回帖

1万

积分

超级版主

积分
11734
发表于 2025-9-17 22:39:42 | 显示全部楼层
Debu*** 发表于 2025-9-17 22:37
最大约2K,2K是分压到约4.12V

不使用ADC,仅用比较器,1.5K就可以,上8.2K下1.5K,支持最高电源电压约30V
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:371
  • 最近打卡:2025-10-14 20:30:53

13

主题

114

回帖

241

积分

中级会员

积分
241
发表于 2025-9-17 23:01:23 | 显示全部楼层
Debu*** 发表于 2025-9-17 22:37
最大约2K,2K是分压到约4.12V

现在R14,R15,R16用4.7K,C11,C12,C13用102。可以启动,也不会说一下子就停。但是调速会一直保持在最低启动那个PWM转速,调高电位器也是一样保持在程序设置的那个转速。但是现在不会停了
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:371
  • 最近打卡:2025-10-14 20:30:53

13

主题

114

回帖

241

积分

中级会员

积分
241
发表于 2025-9-17 23:16:39 | 显示全部楼层
Debu*** 发表于 2025-9-17 22:39
不使用ADC,仅用比较器,1.5K就可以,上8.2K下1.5K,支持最高电源电压约30V

这个有可以参考的例子吗?
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:105
  • 最近打卡:2025-10-15 07:48:38
已绑定手机

2

主题

25

回帖

448

积分

中级会员

积分
448
发表于 2025-9-18 10:21:23 | 显示全部楼层
lyag*** 发表于 2025-9-17 23:01
现在R14,R15,R16用4.7K,C11,C12,C13用102。可以启动,也不会说一下子就停。但是调速会一直保持在最低启 ...

贴程序出来
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:371
  • 最近打卡:2025-10-14 20:30:53

13

主题

114

回帖

241

积分

中级会员

积分
241
发表于 2025-9-18 11:43:23 | 显示全部楼层



/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/*---------------------------------------------------------------------*/



/*************        ¹¦ÄÜ˵Ã÷        **************

±¾³ÌÐòÊÔÑéʹÓÃSTC8H1K28-LQFP32À´Çý¶¯ÎÞ´«¸ÐÆ÷ÎÞË¢ÈýÏàÖ±Á÷µç»ú.

P0.3½ÓµÄµçλÆ÷¿ØÖÆ×ªËÙ, ÄæÊ±ÕëÐýתµçλÆ÷µçѹ½µµÍµç»ú¼õËÙ, ˳ʱÕëÐýתµçλÆ÷µçѹÉý¸ßµç»ú¼ÓËÙ.
¹ØÓÚÎÞ¸ÐÈýÏàÎÞË¢Ö±Á÷µç»úµÄÔ­Àí, Óû§×ÔÐÐѧϰÁ˽â, ±¾Àý²»Óè˵Ã÷.

֮ǰ°æ±¾£¬±¾ÒâΪÁ˼òµ¥£¬ËùÒÔÆô¶¯ºÜ¼òµ¥£¬µ«ÓÉÓÚʹÓÃÍêÈ«¿ª»·Æô¶¯£¬ÊÊÓ¦ÐԲ
Õâ¸ö°æ±¾ÐÞ¸ÄÆô¶¯Ëã·¨£¬²Î¿¼ÁËÒ»ÏÂÂÛÌ³ÍøÓÑbhxµÄÆô¶¯Ëã·¨£¬Ò»Ð©±äÁ¿¶¨Òå¶¼ÒâÒ»ÑùµÄ£¬ÔÚ´ËÌØ±ð¸Ðлbhx£¡
Æä³ÌÐò²Î¿¼Ìû×ÓÈçÏ£º

·ÖÏíÒ»¸öµÍ³É±¾STC8H1K08ÎÞˢСµçµ÷
https://www.stcaimcu.com/thread-17391-1-1.html
(³ö´¦: ¹úо¼¼Êõ½»Á÷ÍøÕ¾)

ʵ²âÆô¶¯±È½ÏÈÝÒ׳ɹ¦¡£Æô¶¯Ê±¼ì²â·´µç¶¯ÊÆÕý³£ºóÔÙÇл»µ½±Õ»·¡£
²»Í¬µÄµç»úÆäÌØÐÔ¿ÉÄܲî±ðºÜ´ó£¬Èç¹ûÆô¶¯²»Ë³³©£¬Ôòµ÷Õû¸úµç»úÌØÐÔÏà¹ØµÄһЩºê²ÎÊýÒÔÊÊÓ¦ÄúµÄµç»ú¡£
Àý×ÓÌṩ2¸öµç»úµÄ²ÎÊý£¬Ò»¸öÊÇËÄÖá·ÉÐÐÆ÷2212µç»ú£¨¸ßתËÙ£©£¬Ò»¸öÊǼÒÓÃÖ±Á÷·çÉȵç»ú£¨µÍתËÙ£©£¬ÒÔ¹©²Î¿¼¡£
ÎÒ²âÊÔÎÒÊÖÉϴ󲿷ֵç»ú¶¼¿ÉÒÔ£¬µÍËÙµÄÓ÷çÉȵç»úµÄ²ÎÊý£¬¸ßËÙµÄÓÃ2212µÄ²ÎÊý¡£
·çÉȵç»úÓÉÓÚ´ø16´çµÄÉÈÒ¶£¬¹ßÐԺܴó£¬ËùÒÔÒªÂýËÙÆô¶¯¡£¶ø2212´øµÄÊÇ´ó½®µÄ9450½°£¬¹ßÐÔС£¬ËùÒÔÆô¶¯¿ì¡£


P0.3½ÓµÄµçλÆ÷ÓÃÓÚÉ趨תËÙ, ˳ʱÕëÐýתµçλÆ÷µç»ú¼ÓËÙ.
µçλÆ÷ADC¶ÁÊýת»»³É0~1023£¬¶ÔÓ¦É趨ռ¿Õ±È0~1023/1024£¬

¹ØÓÚµç»úתËÙ£º
ºÜ¶àÈ˶¼Îʵç»úÄÜת¶à¿ì£¬Æäʵ³ÌÐòÖ»¹ØÐÄÄÜ»»Ïà¶à¿ì£¬¼´µç½Ç¶ÈתËÙ£¬µç»úʵ¼ÊתËÙ¸ú´Å¼«ÊýÓйء£
±¾³ÌÐò×î¿ì»»ÏàËÙ¶ÈΪ12KHz£¬×îС»»ÏàÖÜÆÚ´óÔ¼80us£¬¶ÔÓ¦µç½Ç¶ÈתËÙ£¨»»ÏàתËÙ£©Îª 12KHz/6 *60=12Íòת¡£
ʵ¼Êµç»úתËÙ¸ú´Å¼«ÊýNÓйأ¬µç»úתËÙ = »»ÏàתËÙ / N/2£¬N/2Ò²³Æ´Å¼«¶ÔÊý¡£
ËÄÖá·ÉÐÐÆ÷µÄµç»úÈÝÒ׿´³ö´Å¼«Êý£¬ÊýÒ»ÏÂת×ÓÉϵÄîÏÌúÅð´ÅÌúÊý¾ÍOK£¬±ÈÈç2212µç»úÊÇ12N14P£¬¼´12²Û14¼«£¬12¸öÏßȦ£¬14¸ö´Å¼«¡£
¶ÔÓÚ2212µç»ú£¬×î¸ßתËÙΪ 120000/14/2=17143ת¡£
¶ÔÓڵ紵·ç/Îü³¾Æ÷ÕâÀàµç»ú£¬ÐèÒªºÜ¸ßµÄתËÙ£¬Ö»ÓÐ2¸ö´Å¼«£¬×î¸ßתËÙ¾ÍÊÇ12Íòת¡£


******************************************/

#define FOSC                24000000L        //¶¨ÒåÖ÷ʱÖÓ

#include        "STC8Hxxx.h"


        // ¸ßËÙµç»ú£¬±ÈÈç2212µç»ú
//        #define STARTUP_INTERVAL            12500UL         // Æô¶¯Ê±Á½´Î»»ÏòµÄ×î´ó¼ä¸ôʱ¼ä usΪµ¥Î»
  #define STARTUP_INTERVAL            12500UL
        #define        STARTUP_PWM                            100                         // Æô¶¯Ê±µÄÕ¼¿Õ±È        2212µç»ú
        #define        STOP_PWM                                (STARTUP_PWM-20)        // Í£Ö¹PWM£¬Ð¡ÓÚ´ËPWM¾ÍÍ£»ú£¬ ¸ù¾Ýµç»úÌØÐÔÊʵ±¸Ä±ä
        //#define        STARTUP_END_PhaseTime        600                // ÅÐ¶ÏÆô¶¯½áÊøµÄ»»Ïàʱ¼äus£¬2212µç»ú
        #define        STARTUP_END_PhaseTime        300

        //µÍËÙµç»ú£¬±ÈÈç·çÉȵç»ú
/*        #define STARTUP_INTERVAL            60000UL         // Æô¶¯Ê±Á½´Î»»ÏòµÄ×î´ó¼ä¸ôʱ¼ä usΪµ¥Î»
        #define        STARTUP_PWM                            300                 // Æô¶¯Ê±µÄÕ¼¿Õ±È        8Ôª·çÉȵç»ú, 12V-->300, 18V-->240, 24V-->200
//        #define        STARTUP_PWM                            100
        #define        STOP_PWM                                100                        // Í£Ö¹PWM£¬Ð¡ÓÚ´ËPWM¾ÍÍ£»ú£¬ ¸ù¾Ýµç»úÌØÐÔÊʵ±¸Ä±ä
        #define        STARTUP_END_PhaseTime        12000                // ÅÐ¶ÏÆô¶¯½áÊøµÄ»»Ïàʱ¼äus£¬8Ôª·çÉȵç»ú
        */


typedef enum
{
        MOTOR_IDLE = 0,
        MOTOR_PRE_POSITION,
        MOTOR_STARTING,
        MOTOR_RUNNING,
        MOTOR_STOP,
        MOTOR_RESTART
} runFlagType;

runFlagType run_mode;

u16        Degree30_time;        //30¶È½Çʱ¼ä
u16        SampleTime;                //Æô¶¯º¯Êý-²ÉÑùʱ¼ä PWMÖÜÆÚµÄ¸öÊý
bit        B_zcFound;                //Æô¶¯º¯Êý-¼ì²âµ½¹ý0ʼþ
u8        cmpo_state;                //PWMAÖжÏ-±È½ÏÆ÷Á¬Ðø8¸öÊä³ö״̬
bit        B_cmpo;                        //±È½ÏÆ÷ÓÐЧÊä³ö״̬£¨CMPO 8Á¬1ÔòΪ£¬8Á¬0ÔòΪ0£©
bit        B_CmpoTmp;
u8        commutation_num;        //Æô¶¯±Õ»·»»Ïà¼ÆÊý
bit        B_startDone;

bit        B_TX1_Busy;                // ·¢ËÍæ±êÖ¾
#define        TxLength        128
u8        xdata TxTmp[TxLength];                //ÓÃÓÚµ÷ÊÔ·¢ËÍ
u8        Txwrite, TxRead;//ÓÃÓÚµ÷ÊÔ·¢ËÍ

//===========================================

sbit PWM1P = P1^0;
sbit PWM1N = P1^1;
sbit PWM2P = P1^2;
sbit PWM2N = P1^3;
sbit PWM3P = P1^4;
sbit PWM3N = P1^5;

sbit P_LED  = P2^3;

u8        step;                //Çл»²½Öè
u16        PWM_Value;        // ¾ö¶¨PWMÕ¼¿Õ±ÈµÄÖµ
bit        B_RUN;                //ÔËÐбêÖ¾
u16        PWW_Set;        //Ä¿±êPWMÉèÖÃ
u16        adc11;
bit        B_1ms;                //1ms¶¨Ê±±êÖ¾
bit        B_4ms;                //4ms¶¨Ê±±êÖ¾
bit        B_500ms;
u8        cnt_4ms;
u8        cnt_500ms;

u8        TimeOut;        //¶Âת³¬Ê±
bit        B_start;        //Æô¶¯Ä£Ê½
bit        B_Timer3_OverFlow;

u8        TimeIndex;                //»»Ïàʱ¼ä±£´æË÷Òý
u16        PhaseTime8sum;        //8´Î»»Ïàʱ¼ä, ÓÃÓÚ¼ÆËãʵʱתËÙ = 1/(M*PhaseTime8sum*3/4) ת/Ãë = 60/(M*PhaseTime8sum*3/4) ת/·Ö£¬PhaseTime8sum*3/4Ϊ»»Ïà6´ÎµÄʱ¼ä£¬MΪ´Å¼«¶Ô¡£
u16        PhaseTimeTmp[8];//8¸ö»»Ïàʱ¼ä, Æä sum/16 ¾ÍÊÇ30¶Èµç½Ç¶È
u16        PhaseTime;                //»»Ïàʱ¼ä¼ÆÊý
u8        XiaoCiCnt;                //1:ÐèÒªÏû´Å, 2:ÕýÔÚÏû´Å, 0ÒѾ­Ïû´Å


/*************************/

void        Delay_n_ms(u8 dly)        // N msÑÓʱº¯Êý
{
        u16        j;
        do
        {
                j = FOSC / 10000;
                while(--j)        ;
        }while(--dly);
}

void delay_us(u8 us)        //N usÑÓʱº¯Êý
{
        do
        {
                NOP(20);        //@24MHz
        }
        while(--us);
}

#define ADC_START        (1<<6)        /* ×Ô¶¯Çå0 */
#define ADC_FLAG        (1<<5)        /* Èí¼þÇå0 */

#define        ADC_SPEED        3                /* 0~15, ADCʱÖÓ = SYSclk/2/(n+1) */
#define        RES_FMT                (1<<5)        /* ADC½á¹û¸ñʽ 0: ×ó¶ÔÆë, ADC_RES: D9 D8 D7 D6 D5 D4 D3 D2, ADC_RESL: D1 D0 0  0  0  0  0  0 */
                                                        /*             1: ÓÒ¶ÔÆë, ADC_RES: 0  0  0  0  0  0  D9 D8, ADC_RESL: D7 D6 D5 D4 D3 D2 D1 D0 */

#define CSSETUP                (1<<7)        /* 0~1,  ADCͨµÀÑ¡Ôñʱ¼ä      0: 1¸öADCʱÖÓ, 1: 2¸öADCʱÖÓ,  Ä¬ÈÏ0(ĬÈÏ1¸öADCʱÖÓ) */
#define CSHOLD                (1<<5)        /* 0~3,  ADCͨµÀÑ¡Ôñ±£³Öʱ¼ä  (n+1)¸öADCʱÖÓ, ĬÈÏ1(ĬÈÏ2¸öADCʱÖÓ)                */
#define SMPDUTY                11                /* 10~31, ADCÄ£ÄâÐźŲÉÑùʱ¼ä  (n+1)¸öADCʱÖÓ, ĬÈÏ10(ĬÈÏ11¸öADCʱÖÓ)                                */
                                                        /* ADCת»»Ê±¼ä: 10λADC¹Ì¶¨Îª10¸öADCʱÖÓ, 12λADC¹Ì¶¨Îª12¸öADCʱÖÓ.                                 */

void ADC_config(void)        //ADC³õʼ»¯º¯Êý(ΪÁËʹÓÃADCÊäÈë¶Ë×ö±È½ÏÆ÷ÐźÅ, ʵ¼ÊûÓÐÆô¶¯ADCת»»)
{
        P_SW2 |=  0x80;        //·ÃÎÊXSFR
        //P3n_pure_input(0x3c);        //ÉèÖÃΪ¸ß×èÊäÈë
        P3n_pure_input(0x3f);
        ADC_CONTR = 0x80 + 10;        //ADC on + channel
        ADCCFG = RES_FMT + ADC_SPEED;
        ADCTIM = CSSETUP + CSHOLD + SMPDUTY;
        EADC = 0;                        //½ûÖ¹ADCÖжÏ
}


//========================================================================
// º¯Êý: u16        Get_ADC10bitResult(u8 channel))        //channel = 0~15
//========================================================================
u16        Get_ADC10bitResult(u8 channel)        //channel = 0~15
{
        u8 i;
        ADC_RES = 0;
        ADC_RESL = 0;
        ADC_CONTR = 0x80 | ADC_START | channel;
        NOP(5);                        //
//        while((ADC_CONTR & ADC_FLAG) == 0)        ;        //µÈ´ýADC½áÊø
                i = 255;
                while(i != 0)
                {
                        i--;
                        if((ADC_CONTR & ADC_FLAG) != 0)        break;        //µÈ´ýADC½áÊø
                }
        ADC_CONTR &= ~ADC_FLAG;
        return        ((u16)ADC_RES * 256 + (u16)ADC_RESL);
}


void        Delay_500ns(void)
{
        NOP(6);
}

//#define         CONTEMPRATY         1 //  1:ʹÓû¥²¹PWM£¬ 0:ʹÓõ¥¶ËPWM
#define         CONTEMPRATY         0
#define         BMF_A         13                  // Ô­±¾Í¨µÀ8
#define         BMF_B         12                  // ͨµÀ9
#define         BMF_C         11                  // ͨµÀ10

void StepMotor(void) // »»ÏàÐòÁк¯Êý
{
        if(++step >= 6)        step = 0;
//        if(--step >= 0)        step = 6;

        switch(step)
        {
        case 0:  // AB  PWM1P, PWM2N=1
                        PWMA_ENO = 0x10;        PWM1N=0;        PWM3N=0;        // ´ò¿ªCÏàµÄ¸ß¶ËPWM
                        Delay_500ns();
                        PWMA_ENO = 0x10+0x20*CONTEMPRATY;                // ´ò¿ªCÏàµÄ¸ß¶ËPWM
                        PWM2N = 1;                                // ´ò¿ªBÏàµÄµÍ¶Ë
                        ADC_CONTR = 0x80+BMF_A;        // Ñ¡ÔñP0.0×÷ΪADCÊäÈë ¼´AÏàµçѹ
                        break;
        case 1:  // AC  PWM1P, PWM3N=1
                        PWMA_ENO = 0x00;        PWM2N=0;        PWM3N=0;
                        Delay_500ns();
                        PWMA_ENO = 0x10+0x20*CONTEMPRATY;                // ´ò¿ªCÏàµÄ¸ß¶ËPWM
                        PWM1N = 1;                                // ´ò¿ªAÏàµÄµÍ¶Ë
                //        adc11 = ((adc11 *7)>>3) + Get_ADC10bitResult(10);
                        ADC_CONTR = 0x80+BMF_B;        // Ñ¡ÔñP0.1×÷ΪADCÊäÈë ¼´BÏàµçѹ
                        break;
        case 2:  // BC  PWM2, PWM3N=1
                        PWMA_ENO = 0x00;        PWM2N=0;        PWM3N=0;        // ´ò¿ªBÏàµÄ¸ß¶ËPWM
                        Delay_500ns();
                        PWMA_ENO = 0x04+0x08*CONTEMPRATY;                // ´ò¿ªBÏàµÄ¸ß¶ËPWM
                        PWM1N = 1;                                // ´ò¿ªCÏàµÄµÍ¶Ë
                        ADC_CONTR = 0x80+BMF_C;        // Ñ¡ÔñP0.2×÷ΪADCÊäÈë ¼´CÏàµçѹ
                        break;
        case 3:  // BA  PWM2, PWM1N=1
                        PWMA_ENO = 0x00;        PWM1N=0;        PWM2N=0;
                        Delay_500ns();
                        PWMA_ENO = 0x04+0x08*CONTEMPRATY;                // ´ò¿ªBÏàµÄ¸ß¶ËPWM
                        PWM3N = 1;                                // ´ò¿ªCÏàµÄµÍ¶Ë
                        ADC_CONTR = 0x80+BMF_A;        // Ñ¡ÔñP0.0×÷ΪADCÊäÈë ¼´AÏàµçѹ
                        break;
        case 4:  // CA  PWM3, PWM1N=1
                        PWMA_ENO = 0x00;        PWM1N=0;        PWM2N=0;        // ´ò¿ªAÏàµÄ¸ß¶ËPWM
                        Delay_500ns();
                        PWMA_ENO = 0x01+0x02*CONTEMPRATY;                // ´ò¿ªAÏàµÄ¸ß¶ËPWM
                        PWM3N = 1;                                // ´ò¿ªCÏàµÄµÍ¶Ë
                        adc11 = ((adc11 *7)>>3) + Get_ADC10bitResult(10);
                        ADC_CONTR = 0x80+BMF_B;        // Ñ¡ÔñP0.1×÷ΪADCÊäÈë ¼´BÏàµçѹ
                        break;
        case 5:  // CB  PWM3, PWM2N=1
                        PWMA_ENO = 0x00;        PWM1N=0;        PWM3N=0;
                        Delay_500ns();
                        PWMA_ENO = 0x01+0x02*CONTEMPRATY;                // ´ò¿ªAÏàµÄ¸ß¶ËPWM
                        PWM2N = 1;                                // ´ò¿ªBÏàµÄµÍ¶Ë
                        ADC_CONTR = 0x80+BMF_C;        // Ñ¡ÔñP0.2×÷ΪADCÊäÈë ¼´CÏàµçѹ
                        break;
        /*case 0:  // AB  PWM1P, PWM2N=1
                        PWMA_ENO = 0x00;        PWM1N=0;        PWM3N=0;
                        Delay_500ns();
                        PWMA_ENO = 0x01+0x02*CONTEMPRATY;                // ´ò¿ªAÏàµÄ¸ß¶ËPWM
                        PWM2N = 1;                                // ´ò¿ªBÏàµÄµÍ¶Ë
                        ADC_CONTR = 0x80+BMF_C;        // Ñ¡ÔñP0.2×÷ΪADCÊäÈë ¼´CÏàµçѹ
                        break;
        case 1:  // AC  PWM1P, PWM3N=1
                        PWMA_ENO = 0x00;        PWM1N=0;        PWM2N=0;        // ´ò¿ªAÏàµÄ¸ß¶ËPWM
                        Delay_500ns();
                        PWMA_ENO = 0x01+0x02*CONTEMPRATY;                // ´ò¿ªAÏàµÄ¸ß¶ËPWM
                        PWM3N = 1;                                // ´ò¿ªCÏàµÄµÍ¶Ë
                        ADC_CONTR = 0x80+BMF_B;        // Ñ¡ÔñP0.1×÷ΪADCÊäÈë ¼´BÏàµçѹ
                        break;
        case 2:  // BC  PWM2, PWM3N=1
                        PWMA_ENO = 0x00;        PWM1N=0;        PWM2N=0;
                        Delay_500ns();
                        PWMA_ENO = 0x04+0x08*CONTEMPRATY;                // ´ò¿ªBÏàµÄ¸ß¶ËPWM
                        PWM3N = 1;                                // ´ò¿ªCÏàµÄµÍ¶Ë
                        ADC_CONTR = 0x80+BMF_A;        // Ñ¡ÔñP0.0×÷ΪADCÊäÈë ¼´AÏàµçѹ
                        break;
        case 3:  // BA  PWM2, PWM1N=1
                        PWMA_ENO = 0x00;        PWM2N=0;        PWM3N=0;        // ´ò¿ªBÏàµÄ¸ß¶ËPWM
                        Delay_500ns();
                        PWMA_ENO = 0x04+0x08*CONTEMPRATY;                // ´ò¿ªBÏàµÄ¸ß¶ËPWM
                        PWM1N = 1;                                // ´ò¿ªCÏàµÄµÍ¶Ë
                        ADC_CONTR = 0x80+BMF_C;        // Ñ¡ÔñP0.2×÷ΪADCÊäÈë ¼´CÏàµçѹ
                        break;
        case 4:  // CA  PWM3, PWM1N=1
                        PWMA_ENO = 0x00;        PWM2N=0;        PWM3N=0;
                        Delay_500ns();
                        PWMA_ENO = 0x10+0x20*CONTEMPRATY;                // ´ò¿ªCÏàµÄ¸ß¶ËPWM
                        PWM1N = 1;                                // ´ò¿ªAÏàµÄµÍ¶Ë
                        adc11 = ((adc11 *7)>>3) + Get_ADC10bitResult(10);
                        ADC_CONTR = 0x80+BMF_B;        // Ñ¡ÔñP0.1×÷ΪADCÊäÈë ¼´BÏàµçѹ
                        break;
        case 5:  // CB  PWM3, PWM2N=1
                        PWMA_ENO = 0x10;        PWM1N=0;        PWM3N=0;        // ´ò¿ªCÏàµÄ¸ß¶ËPWM
                        Delay_500ns();
                        PWMA_ENO = 0x10+0x20*CONTEMPRATY;                // ´ò¿ªCÏàµÄ¸ß¶ËPWM
                        PWM2N = 1;                                // ´ò¿ªBÏàµÄµÍ¶Ë
                        ADC_CONTR = 0x80+BMF_A;        // Ñ¡ÔñP0.0×÷ΪADCÊäÈë ¼´AÏàµçѹ
                        break;*/
       
        default:
                        break;
        }

        if(B_start)                CMPCR1 = 0x8C;        // Æô¶¯Ê±½ûֹϽµÑغÍÉÏÉýÑØÖжÏ
        else        //ÔËÐÐģʽ£¬ÔÊÐí±È½ÏÆ÷ÖжÏ
        {
                if(step & 1)        CMPCR1 = 0x8c + 0x20;        // ±È½ÏÆ÷ÉÏÉýÑØÖжÏ,        PIE=1: ÔÊÐí±È½ÏÆ÷ÉÏÉýÑØÖжÏ, PIE=0: ½ûÖ¹ÉÏÉýÑØÖжÏ.        NIE=1: ÔÊÐí±È½ÏÆ÷ϽµÑØÖжÏ, NIE=0: ½ûֹϽµÑØÖжÏ.
                else                        CMPCR1 = 0x8c + 0x10;        // ±È½ÏÆ÷ϽµÑØÖжÏ,        PIE=1: ÔÊÐí±È½ÏÆ÷ÉÏÉýÑØÖжÏ, PIE=0: ½ûÖ¹ÉÏÉýÑØÖжÏ.        NIE=1: ÔÊÐí±È½ÏÆ÷ϽµÑØÖжÏ, NIE=0: ½ûֹϽµÑØÖжÏ.
        }
}



void PWMA_config(void)
{
        P_SW2 |= 0x80;                //SFR enable

        PWM1P  = 0;
        PWM1N = 0;
        PWM2P  = 0;
        PWM2N = 0;
        PWM3P  = 0;
        PWM3N = 0;
        P1n_push_pull(0x3f);

        PWMA_PSCR = 0;                // Ô¤·ÖƵ¼Ä´æÆ÷, ·ÖƵ Fck_cnt = Fck_psc/(PSCR[15:0}+1), ±ßÑØ¶ÔÆëPWMƵÂÊ = SYSclk/((PSCR+1)*(AAR+1)), ÖÐÑë¶ÔÆëPWMƵÂÊ = SYSclk/((PSCR+1)*(AAR+1)*2).
        PWMA_DTR  = 12;                // ËÀÇøÊ±¼äÅäÖÃ, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
                                                //                                0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
        PWMA_ARR    = 1023;        // ×Ô¶¯ÖØ×°ÔؼĴæÆ÷,  ¿ØÖÆPWMÖÜÆÚ
        PWMA_CCER1  = 0;
        PWMA_CCER2  = 0;
        PWMA_SR1    = 0;
        PWMA_SR2    = 0;
        PWMA_ENO    = 0;
        PWMA_PS     = 0;
        PWMA_IER    = 0;

        PWMA_CCMR1  = 0x68;                // ͨµÀģʽÅäÖÃ, PWMģʽ1, Ô¤×°ÔØÔÊÐí
        PWMA_CCR1   = 0;                // ±È½ÏÖµ, ¿ØÖÆÕ¼¿Õ±È(¸ßµçƽʱÖÓÊý)
        PWMA_CCER1 |= 0x05;                // ¿ªÆô±È½ÏÊä³ö, ¸ßµçƽÓÐЧ
        PWMA_PS    |= 0;                // Ñ¡ÔñIO, 0:Ñ¡ÔñP1.0 P1.1, 1:Ñ¡ÔñP2.0 P2.1, 2:Ñ¡ÔñP6.0 P6.1,
        PWMA_CCMR1  = 0x68;                // ͨµÀģʽÅäÖÃ, PWMģʽ1, Ô¤×°ÔØÔÊÐí
//        PWMA_ENO   |= 0x01;                // IOÊä³öÔÊÐí,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
//        PWMA_IER   |= 0x02;                // ʹÄÜÖжÏ

        PWMA_CCMR2  = 0x68;                // ͨµÀģʽÅäÖÃ, PWMģʽ1, Ô¤×°ÔØÔÊÐí
        PWMA_CCR2   = 0;                // ±È½ÏÖµ, ¿ØÖÆÕ¼¿Õ±È(¸ßµçƽʱÖÓÊý)
        PWMA_CCER1 |= 0x50;                // ¿ªÆô±È½ÏÊä³ö, ¸ßµçƽÓÐЧ
        PWMA_PS    |= (0<<2);        // Ñ¡ÔñIO, 0:Ñ¡ÔñP1.2 P1.3, 1:Ñ¡ÔñP2.2 P2.3, 2:Ñ¡ÔñP6.2 P6.3,
        PWMA_CCMR2  = 0x68;                // ͨµÀģʽÅäÖÃ, PWMģʽ1, Ô¤×°ÔØÔÊÐí
//        PWMA_ENO   |= 0x04;                // IOÊä³öÔÊÐí,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
//        PWMA_IER   |= 0x04;                // ʹÄÜÖжÏ

        PWMA_CCMR3  = 0x68;                // ͨµÀģʽÅäÖÃ, PWMģʽ1, Ô¤×°ÔØÔÊÐí
        PWMA_CCR3   = 0;                // ±È½ÏÖµ, ¿ØÖÆÕ¼¿Õ±È(¸ßµçƽʱÖÓÊý)
        PWMA_CCER2 |= 0x05;                // ¿ªÆô±È½ÏÊä³ö, ¸ßµçƽÓÐЧ
        PWMA_PS    |= (0<<4);        // Ñ¡ÔñIO, 0:Ñ¡ÔñP1.4 P1.5, 1:Ñ¡ÔñP2.4 P2.5, 2:Ñ¡ÔñP6.4 P6.5,
        PWMA_CCMR3  = 0x68;                // ͨµÀģʽÅäÖÃ, PWMģʽ1, Ô¤×°ÔØÔÊÐí
//        PWMA_ENO   |= 0x10;                // IOÊä³öÔÊÐí,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
//        PWMA_IER   |= 0x08;                // ʹÄÜÖжÏ

    PWMA_CCMR4  = 0x68;                // ͨµÀģʽÅäÖÃ, PWMģʽ1, Ô¤×°ÔØÔÊÐí
    PWMA_CCER2 |= 0x50;                // ¿ªÆô±È½ÏÊä³ö, ¸ßµçƽÓÐЧ
        PWMA_CCR4   = 768;                // ±È½ÏÖµ, ¿ØÖÆÕ¼¿Õ±È(¸ßµçƽʱÖÓÊý)                        PWM4´¥·¢ÖжÏ, ͬ²½²ÉÑù, ÔÚPWMÖÜÆÚ¿ì½áÊøÊ±¶Ô±È½ÏÆ÷²ÉÑù£¬ÕâʱºòûÓÐPWM¸ÉÈÅ
    PWMA_CCMR4  = 0x68;                // ͨµÀģʽÅäÖÃ, PWMģʽ1, Ô¤×°ÔØÔÊÐí

        PWMA_BKR    = 0x80;                // Ö÷Êä³öʹÄÜ Ï൱ÓÚ×Ü¿ª¹Ø
        PWMA_CR1    = 0x81;                // ʹÄܼÆÊýÆ÷, ÔÊÐí×Ô¶¯ÖØ×°ÔؼĴæÆ÷»º³å, ±ßÑØ¶ÔÆëģʽ, ÏòÉϼÆÊý,  bit7=1:д×Ô¶¯ÖØ×°ÔؼĴæÆ÷»º³å(±¾ÖÜÆÚ²»»á±»´òÈÅ), =0:Ö±½Óд×Ô¶¯ÖØ×°ÔؼĴæÆ÷±¾(ÖÜÆÚ¿ÉÄÜ»áÂÒµô)
        PWMA_EGR    = 0x01;                //²úÉúÒ»´Î¸üÐÂʼþ, Çå³ý¼ÆÊýÆ÷ºÍÓë·ÖƵ¼ÆÊýÆ÷, ×°ÔØÔ¤·ÖƵ¼Ä´æÆ÷µÄÖµ
//        PWMA_ISR_En = PWMA_IER;        //ÉèÖñêÖ¾ÔÊÐíͨµÀ1~4Öжϴ¦Àí
}

//        PWMA_PS   = (0<<6)+(0<<4)+(0<<2)+0;        //Ñ¡ÔñIO, 4Ïî´Ó¸ßµ½µÍ(´Ó×óµ½ÓÒ)¶ÔÓ¦PWM1 PWM2 PWM3 PWM4, 0:Ñ¡ÔñP1.x, 1:Ñ¡ÔñP2.x, 2:Ñ¡ÔñP6.x,
//  PWMA_PS    PWM4N PWM4P    PWM3N PWM3P    PWM2N PWM2P    PWM1N PWM1P
//    00       P1.7  P1.6     P1.5  P1.4     P1.3  P1.2     P1.1  P1.0
//    01       P2.7  P2.6     P2.5  P2.4     P2.3  P2.2     P2.1  P2.0
//    02       P6.7  P6.6     P6.5  P6.4     P6.3  P6.2     P6.1  P6.0
//    03       P3.3  P3.4      --    --       --    --       --    --


void CMP_config(void)        //±È½ÏÆ÷³õʼ»¯³ÌÐò
{
        CMPCR1 = 0x8C;                        // 1000 1100 ´ò¿ª±È½ÏÆ÷£¬P3.6×÷Ϊ±È½ÏÆ÷µÄ·´ÏàÊäÈë¶Ë£¬ADCÒý½Å×÷ΪÕýÊäÈë¶Ë
        CMPCR2 = 60;                        //60¸öʱÖÓÂ˲¨   ±È½Ï½á¹û±ä»¯ÑÓʱÖÜÆÚÊý, 0~63
        P3n_pure_input(0x40);        //CMP-(P3.6)ÉèÖÃΪ¸ß×è.

        P_SW2 |= 0x80;                //SFR enable
//        CMPEXCFG |= (0<<6);        //bit7 bit6: ±È½ÏÆ÷³ÙÖÍÊäÈëÑ¡Ôñ: 0: 0mV,  1: 10mV, 2: 20mV, 3: 30mV
//        CMPEXCFG |= (0<<2);        //bit2: ÊäÈ븺¼«ÐÔÑ¡Ôñ, 0: Ñ¡ÔñP3.6×öÊäÈë,   1: Ñ¡ÔñÄÚ²¿BandGapµçѹBGv×ö¸ºÊäÈë.
//        CMPEXCFG |=  0;                //bit1 bit0: ÊäÈëÕý¼«ÐÔÑ¡Ôñ, 0: Ñ¡ÔñP3.7×öÊäÈë,   1: Ñ¡ÔñP5.0×öÊäÈë,  2: Ñ¡ÔñP5.1×öÊäÈë,  3: Ñ¡ÔñADCÊäÈë(ÓÉADC_CHS[3:0]ËùÑ¡ÔñµÄADCÊäÈë¶Ë×öÕýÊäÈë).
//        CMPEXCFG = (0<<6)+(0<<2)+3;
}

#define                PHASE_TIME_MAX        8190                //×î´ó»»Ïàʱ¼ä, us, ±ÜÃâÀÛ¼ÓºÍÒç³ö
void CMP_ISR(void) interrupt 21                //±È½ÏÆ÷ÖжϺ¯Êý, ¼ì²âµ½·´µç¶¯Êƹý0ʼþ
{
        u8        i;
        CMPCR1 &= ~0x40;        // ÐèÈí¼þÇå³ýÖжϱê־λ

        if(XiaoCiCnt == 0)        //Ïû´Åºó²Å¼ì²â¹ý0ʼþ,   XiaoCiCnt=1:ÐèÒªÏû´Å, =2:ÕýÔÚÏû´Å, =0ÒѾ­Ïû´Å
        {
                T4T3M &= ~(1<<3);        // Timer3Í£Ö¹ÔËÐÐ
                PhaseTime = (((u16)T3H << 8) + T3L) >> 1;        //¶ÁÈ¡Timer3²âÁ¿µ½µÄ»»Ïàʱ¼ä(µ¥Î»0.5us)£¬µ¥Î»×ªÎª1us
                T3H = 0;        T3L = 0;
                T4T3M |=  (1<<3);        //Timer3¿ªÊ¼ÔËÐÐ

                if(B_Timer3_OverFlow)        //Çл»Ê±¼ä¼ä¸ô(Timer3)ÓÐÒç³ö
                {
                        B_Timer3_OverFlow = 0;
                        PhaseTime = PHASE_TIME_MAX;        //»»Ïàʱ¼ä×î´ó8ms, 2212µç»ú12V¿Õת×î¸ßËÙ130usÇл»Ò»Ïà(200RPS 12000RPM), 480mA
                }
                else if(PhaseTime >= PHASE_TIME_MAX)        PhaseTime = PHASE_TIME_MAX;        //»»Ïàʱ¼ä×î´ó8ms, 2212µç»ú12V¿Õת×î¸ßËÙ130usÇл»Ò»Ïà(200RPS 12000RPM), 480mA

                PhaseTimeTmp[TimeIndex] = PhaseTime;        //±£´æÒ»´Î»»Ïàʱ¼ä
                if(++TimeIndex >= 8)        TimeIndex = 0;        //ÀÛ¼Ó8´Î
                for(PhaseTime=0, i=0; i<8; i++)        PhaseTime += PhaseTimeTmp;        //Çó8´Î»»Ïàʱ¼äÀÛ¼ÓºÍ
                PhaseTime = PhaseTime >> 4;                //Çó8´Î»»Ïàʱ¼äµÄƽ¾ùÖµµÄÒ»°ë, ¼´30¶Èµç½Ç¶È
                if(PhaseTime >= 40)        TimeOut = 125;        //»»Ïàʱ¼äºÏ·¨  ¶Âת500ms³¬Ê±


                T4T3M &= ~(1<<7);                                //Timer4Í£Ö¹ÔËÐÐ
                PhaseTime  = PhaseTime  << 1;        //2¸ö¼ÆÊý1us
                PhaseTime = 0 - PhaseTime;
                T4H = (u8)(PhaseTime >> 8);                //×°ÔØ30¶È½ÇÑÓʱ
                T4L = (u8)PhaseTime;
                T4T3M |=  (1<<7);        //Timer4¿ªÊ¼ÔËÐÐ
                XiaoCiCnt = 1;                //1:ÐèÒªÏû´Å, 2:ÕýÔÚÏû´Å, 0ÒѾ­Ïû´Å
        }
}

void Timer0_config(void)        //Timer0³õʼ»¯º¯Êý
{
        Timer0_16bitAutoReload(); // T0¹¤×÷ÓÚ16λ×Ô¶¯ÖØ×°
        Timer0_1T();
        TH0 = (65536UL-FOSC/1000) / 256; //1ms
        TL0 = (65536UL-FOSC/1000) % 256;
        TR0 = 1; // ´ò¿ª¶¨Ê±Æ÷0

        ET0 = 1;// ÔÊÐíET0ÖжÏ
}

void Timer0_ISR(void) interrupt 1        //Timer0ÖжϺ¯Êý, 20us
{
        B_1ms = 1;        //1ms¶¨Ê±±êÖ¾
}

//============================ timer3³õʼ»¯º¯Êý ============================================
void        Timer3_Config(void)
{
        P_SW2 |= 0x80;                //SFR enable
        T4T3M &= 0xf0;                //Í£Ö¹¼ÆÊý, ¶¨Ê±Ä£Ê½, 12Tģʽ, ²»Êä³öʱÖÓ
        T3H = 0;
        T3L = 0;

        T3T4PIN = 0x01;                //Ñ¡ÔñIO, 0x00: T3--P0.4, T3CLKO--P0.5, T4--P0.6, T4CLKO--P0.7;    0x01: T3--P0.0, T3CLKO--P0.1, T4--P0.2, T4CLKO--P0.3;
        IE2   |=  (1<<5);        //ÔÊÐíÖжÏ
        T4T3M |=  (1<<3);        //¿ªÊ¼ÔËÐÐ
}

//============================ timer4³õʼ»¯º¯Êý ============================================
void        Timer4_Config(void)
{
        P_SW2 |= 0x80;                //SFR enable
        T4T3M &= 0x0f;                //Í£Ö¹¼ÆÊý, ¶¨Ê±Ä£Ê½, 12Tģʽ, ²»Êä³öʱÖÓ
        T4H = 0;
        T4L = 0;

        T3T4PIN = 0x01;                //Ñ¡ÔñIO, 0x00: T3--P0.4, T3CLKO--P0.5, T4--P0.6, T4CLKO--P0.7;    0x01: T3--P0.0, T3CLKO--P0.1, T4--P0.2, T4CLKO--P0.3;
        IE2   |=  (1<<6);        //ÔÊÐíÖжÏ
//        T4T3M |=  (1<<7);        //¿ªÊ¼ÔËÐÐ
}

//=========================== timer3ÖжϺ¯Êý =============================================
void timer3_ISR (void) interrupt TIMER3_VECTOR
{
        B_Timer3_OverFlow = 1;        //Òç³ö±êÖ¾
}

//=========================== timer4ÖжϺ¯Êý =============================================
void timer4_ISR (void) interrupt TIMER4_VECTOR
{
        T4T3M &= ~(1<<7);        //Timer4Í£Ö¹ÔËÐÐ
        if(XiaoCiCnt == 1)                //±ê¼ÇÐèÒªÏû´Å. ÿ´Î¼ì²âµ½¹ý0ʼþºóµÚÒ»´ÎÖжÏΪ30¶È½ÇÑÓʱ, ÉèÖÃÏû´ÅÑÓʱ.
        {
                XiaoCiCnt = 2;                //1:ÐèÒªÏû´Å, 2:ÕýÔÚÏû´Å, 0ÒѾ­Ïû´Å
                if(B_RUN)        StepMotor();        //µç»úÕýÔÚÔËÐÐ
                                                                                //Ïû´Åʱ¼ä, »»ÏàºóÏßȦ(µç¸Ð)µçÁ÷¼õСµ½0µÄ¹ý³ÌÖÐ, ³öÏÖ·´µç¶¯ÊÆ, µçÁ÷Ô½´óÏû´Åʱ¼äÔ½³¤, ¹ý0¼ì²âÒªÔÚÕâ¸öʱ¼äÖ®ºó
                                                                                //100%Õ¼¿Õ±Èʱʩ¼Ó½ÏÖØ¸ºÔØ, µç»úµçÁ÷ÉÏÉý, ¿ÉÒÔʾ²¨Æ÷¿´Ïû´Åʱ¼ä.
                                                                                //ʵ¼ÊÉÏ, Ö»ÒªÔÚ»»ÏàºóÑÓʱ¼¸Ê®us²Å¼ì²â¹ýÁã, ¾Í¿ÉÒÔÁË
                T4H = (u8)((65536UL - 30*2) >> 8);        //×°ÔØÏû´ÅÑÓʱ
                T4L = (u8)(65536UL - 30*2);
                T4T3M |=  (1<<7);        //Timer4¿ªÊ¼ÔËÐÐ
        }
        else if(XiaoCiCnt == 2)        XiaoCiCnt = 0;                //1:ÐèÒªÏû´Å, 2:ÕýÔÚÏû´Å, 0ÒѾ­Ïû´Å
}


/******************* Ç¿ÖÆµç»úÆô¶¯º¯Êý ***************************/
void StartMotor(void)
{
        u16 i;

        if(run_mode == MOTOR_IDLE)        //¿ÕÏÐģʽ
        {
                B_RUN = 0;
                PWM_Value  = 0;        // ÉèÖÃÍ£Ö¹Õ¼¿Õ±È
                PWMA_CCR1 = PWM_Value;
                PWMA_CCR2 = PWM_Value;
                PWMA_CCR3 = PWM_Value;
        }

        else if(run_mode == MOTOR_PRE_POSITION)        //Ô¤¶¨Î»Ä£Ê½
        {
                if(SampleTime == 0)        //¸Õ¿ªÊ¼, Æô¶¯Ç°½«SampleTime=0
                {
                        PWM_Value  = STARTUP_PWM;        // ÉèÖÃÆô¶¯Õ¼¿Õ±È
                        PWMA_CCR1 = PWM_Value;
                        PWMA_CCR2 = PWM_Value;
                        PWMA_CCR3 = PWM_Value;
                        SampleTime = 1;
                }

                else if(++SampleTime >= (STARTUP_INTERVAL/43))        //Ô¤¶¨Î»Ê±¼äµ½£¬×¼±¸Æô¶¯µç»ú£¬Ô¤¶¨Î»Ê±¼äΪ×î´ó»»Ïàʱ¼ä, 43ÊÇPWMÖÜÆÚΪ43us
                {
                        for(i=0; i<8; i++)        PhaseTimeTmp = STARTUP_INTERVAL/43;        //³õʼĬÈÏ×î´ó»»Ïàʱ¼ä
                        TimeIndex = 0;
                        commutation_num = 0;        //Æô¶¯»»Ïà´ÎÊýÀÛ¼Ó
                        Degree30_time   = 0;
                        SampleTime = STARTUP_INTERVAL/43/4;
                        run_mode = MOTOR_STARTING;        //ÏÂÒ»¸öģʽ£ºÆô¶¯Ä£Ê½
                        StepMotor();        //»»ÏàÒ»´Î
                }
        }

        else if(run_mode == MOTOR_STARTING)        //Æô¶¯Ä£Ê½
        {
                SampleTime++;

                if(Degree30_time != 0)        //ÓÐ30¶È½ÇÑÓʱ
                {
                        if(--Degree30_time == 0)        //30¶È½ÇÑÓʱµ½£¬Ôò»»Ïà
                        {
                                StepMotor();        //»»Ïà
                                commutation_num++;        //Æô¶¯»»Ïà´ÎÊýÀÛ¼Ó
                                if ((commutation_num >= 36) && (PhaseTime <= (STARTUP_END_PhaseTime/43)))        //Æô¶¯»»Ïà´ÎÊý11ÒÔÉÏ£¬²¢ÇÒ»»Ïàʱ¼äСÓÚÒ»¶¨Öµ£¬ÔòÆô¶¯³É¹¦
                                {
                                        B_startDone = 1;        //ÒÑÆô¶¯
                                        B_start   = 0;        //ÒÑÆô¶¯Íê³É
                                        B_RUN     = 1;        //ÒÑÔËÐÐ
                                        TimeOut = 200;        //¶Âת³¬Ê±
                                        run_mode = MOTOR_RUNNING;

                                        delay_us(50);
                                        XiaoCiCnt = 0;                //1:ÐèÒªÏû´Å, 2:ÕýÔÚÏû´Å, 0ÒѾ­Ïû´Å
                                        if(step & 1)        CMPCR1 = 0x8c + 0x20;        // ±È½ÏÆ÷ÉÏÉýÑØÖжÏ,        PIE=1: ÔÊÐí±È½ÏÆ÷ÉÏÉýÑØÖжÏ, PIE=0: ½ûÖ¹ÉÏÉýÑØÖжÏ.        NIE=1: ÔÊÐí±È½ÏÆ÷ϽµÑØÖжÏ, NIE=0: ½ûֹϽµÑØÖжÏ.
                                        else                        CMPCR1 = 0x8c + 0x10;        // ±È½ÏÆ÷ϽµÑØÖжÏ,        PIE=1: ÔÊÐí±È½ÏÆ÷ÉÏÉýÑØÖжÏ, PIE=0: ½ûÖ¹ÉÏÉýÑØÖжÏ.        NIE=1: ÔÊÐí±È½ÏÆ÷ϽµÑØÖжÏ, NIE=0: ½ûֹϽµÑØÖжÏ.
                                }
                        }
                }

                else        //¼ì²â·´µç¶¯Êƹý0
                {
                        B_zcFound = 0;
                        if (step & 1)        // ÉÏÉýÑØ
                        {
                                if (B_cmpo) B_zcFound = 1;        //Á¬Ðø4¸ö²ÉÑùΪ1, ±êÖ¾¹ý0ʼþ
                        }
                        else        //ϽµÑØ
                        {
                                if (!B_cmpo) B_zcFound = 1;        //Á¬Ðø4¸ö²ÉÑùΪ0, ±êÖ¾¹ý0ʼþ
                        }

                        if (B_zcFound && (SampleTime > STARTUP_END_PhaseTime/43/4))        //¼ì²âµ½¹ý0ʼþ, »»Ïàʱ¼ä¹ýСÔò²»»»Ïà
                        {
                                if(SampleTime > (STARTUP_INTERVAL/43))                SampleTime = STARTUP_INTERVAL/43;        //»»Ïà¹ýÂý£¬
                                PhaseTimeTmp[TimeIndex] = SampleTime;        //±£´æ±¾´Î»»Ïàʱ¼ä
                                SampleTime = 0;
                                if(++TimeIndex >= 8)        TimeIndex = 0;        //Ë÷ÒýÒç³ö¹é0
                                for(PhaseTime8sum=0, i=0; i<8; i++)        PhaseTime8sum += PhaseTimeTmp;        //Çó8´Î»»Ïàʱ¼äÀÛ¼ÓºÍ, ÓÃÓÚ¼ÆËãʵʱתËÙ = 1/(M*PhaseTime8sum*3/4) ת/Ãë = 60/(M*PhaseTime8sum*3/4) ת/·Ö£¬PhaseTime8sum*3/4Ϊ»»Ïà6´ÎµÄʱ¼ä£¬MΪ´Å¼«¶Ô¡£
                                PhaseTime = PhaseTime8sum >> 3;                //»»Ïàʱ¼ä
                                if(PhaseTime >= 18)        Degree30_time = PhaseTime/2 - 8;        //»»Ïàʱ¼äµÄÒ»°ë, ¼´30¶Èµç½Ç¶È, -8ΪÐÞÕý8´Î²ÉÑùʱ¼ä
                                else                                Degree30_time = 1;                                        //»»Ïàʱ¼äµÄÒ»°ë, ¼´30¶Èµç½Ç¶È

                        }
                        else if(SampleTime >= (STARTUP_INTERVAL/43))        //³¬Ê±ÖØÐÂÔ¤¶¨Î»Æô¶¯
                        {
                                SampleTime = 0;
                                run_mode  = MOTOR_PRE_POSITION; //³¬Ê±ÔòÖØÐÂÔ¤¶¨Î»Æô¶¯
                                StepMotor();        //»»ÏàÒ»´Î
                        }
                }
        }
        if(TxRead != Txwrite)        //ÓÐÊý¾ÝÒª·¢ËÍ
        {
                if(!B_TX1_Busy)
                {
                        B_TX1_Busy = 1;
                        SBUF = TxTmp[TxRead];
                        if(++TxRead >= TxLength)        TxRead = 0;
                }
        }
}


void PWMA_ISR(void) interrupt PWMA_VECTOR // 23.4375KHz£¨42.67us£©ÖжÏÂÊ£¬ÓÃÓÚ´¦ÀíÆô¶¯µç»ú£¬²éѯ¶ÁÈ¡±È½ÏÆ÷½á¹û
{
        cmpo_state = (cmpo_state << 1) | (CMPCR1 & 1);        // ¶ÁÈ¡±È½ÏÆ÷״̬£¬·ÅÔÚÒ»¸ö×Ö½ÚÖÐ, Á¬Ðø8´Î¼ì²âµ½Ïàͬµçƽ²ÅÈÏΪÓÐЧ
        if((cmpo_state & 0xff) == 0xfF)        B_cmpo  = 1;        //Á¬Ðø4¸ö²ÉÑùΪ1, Ôò±È½ÏÆ÷Êä³ö1
        if((cmpo_state & 0xff) == 0x00)        B_cmpo  = 0;        //Á¬Ðø4¸ö²ÉÑùΪ0, Ôò±È½ÏÆ÷Êä³ö0

    StartMotor();        //Æô¶¯µç»ú
    if(B_RUN)        PWMA_IER = 0;    //Èç¹ûµç»úÒÑÆô¶¯ÔËÐУ¬Ôò½ûÖ¹PWMAÖжÏ
    if(run_mode == MOTOR_IDLE)        PWMA_IER = 0;
        PWMA_SR1 = 0;        //Çå³ý±êÖ¾
}




/**********************************************/
void main(void)
{
        u16        j;
       
        //P1M0 = 0x00; P1M1 = 0x00;
  P1M0 = 0xff; P1M1 = 0x00;        
        P3M0 = 0x00; P3M1 = 0x3f;
  

       
/*        P2n_standard(0xf8);
        P3n_standard(0xbf);
        P5n_standard(0x10);*/

        adc11 = 0;

        PWMA_config();
        ADC_config();
        CMP_config();
        Timer0_config();        // Timer0³õʼ»¯º¯Êý
        Timer3_Config();        // Timer3³õʼ»¯º¯Êý
        Timer4_Config();        // Timer4³õʼ»¯º¯Êý
        PWW_Set = 0;
        TimeOut = 0;

        P1M0 = 0xff; P1M1 = 0x00;        
        P3M0 = 0x00; P3M1 = 0xcf;

        EA  = 1; // ´ò¿ª×ÜÖжÏ


        while (1)
        {
                if(B_1ms)                // 1msʱ϶
                {
                        B_1ms = 0;

                        if(++cnt_4ms == 4)
                        {
                                cnt_4ms = 0;
                                B_4ms   = 1;        //4msʱ϶±êÖ¾
                                if(++cnt_500ms == 125)
                                {
                                        cnt_500ms = 0;
                                        B_500ms   = 1;        //500msʱ϶±êÖ¾
                                }
                        }

                        if(PWW_Set < STOP_PWM)        // PWM¹ýСͣת
                        {
                                if(run_mode != MOTOR_IDLE)
                                {
                                        B_RUN = 0;
                                        PWM_Value = 0;
                                        CMPCR1 = 0x8C;        // ¹Ø±È½ÏÆ÷ÖжÏ
                                        PWMA_ENO  = 0;
                                        PWMA_CCR1 = 0;
                                        PWMA_CCR2 = 0;
                                        PWMA_CCR3 = 0;
                                        PWM1N=0;        PWM2N=0;        PWM3N=0;
                                        run_mode = MOTOR_IDLE;
                                }
                        }
                        if(B_RUN)        //ÕýÔÚÔËÐÐÖÐ
                        {
                                if(PWM_Value < PWW_Set)        PWM_Value++;        //ÓÍßúËæµçλÆ÷
                                if(PWM_Value > PWW_Set)        PWM_Value--;
                                PWMA_CCR1 = PWM_Value;
                                PWMA_CCR2 = PWM_Value;
                                PWMA_CCR3 = PWM_Value;
                        }

                        if (run_mode == MOTOR_IDLE)        //Èç¹ûÊÇÍ£»úģʽ£¬Ôò×öADC
                        {
                                adc11 = ((adc11 *7)>>3) + Get_ADC10bitResult(10);        //µÍͨÂ˲¨½á¹ûΪ13λ,   6: ADC8(µçÁ÷), 7£ºADC9(µçѹ)£¬11£ºADC11(µçλÆ÷)
                        }

                        j = adc11;
                        if(j != adc11)        j = adc11;
                        PWW_Set  = j >> 3;        //ÓÍÃÅÊÇ10λµÄ
                }

                if(B_4ms)                // 4msʱ϶
                {
                        B_4ms = 0;

                        if(TimeOut != 0)
                        {
                                if(--TimeOut == 0)        //¶Âת³¬Ê±
                                {
                                        B_RUN  = 0;
                                        PWM_Value = 0;
                                        CMPCR1 = 0x8C;        // ¹Ø±È½ÏÆ÷ÖжÏ
                                        PWMA_ENO   = 0;
                                        PWMA_CCR1 = 0;
                                        PWMA_CCR2 = 0;
                                        PWMA_CCR3 = 0;
                                        PWM1N=0;        PWM2N=0;        PWM3N=0;
                                        Delay_n_ms(250);        //¶Âתʱ,ÑÓʱһµãʱ¼äÔÙÆô¶¯
                                        run_mode = MOTOR_IDLE;
                                }
                        }

                        if(!B_RUN && (PWW_Set >= STARTUP_PWM))        // Õ¼¿Õ±È´óÓÚÉ趨ֵ, ²¢ÇÒµç»úδÔËÐÐ, ÔòÆô¶¯µç»ú
                        {
                                if (run_mode == MOTOR_IDLE)        //Èç¹ûÊÇÍ£»úģʽ£¬Ôò¿ªÊ¼Ô¤¶¨Î»
                                {
                                        B_start = 1;                //Æô¶¯Ä£Ê½
                            SampleTime = 0;
                            run_mode = MOTOR_PRE_POSITION;        //½øÈëÔ¤¶¨Î»Ä£Ê½
                                        StepMotor();        //»»ÏàÒ»´Î
                                    PWMA_SR1 = 0;        //Çå³ý±êÖ¾
                            B_startDone = 0;
                                        PWMA_IER = 1<<4;    //ʹÄÜPWMA 4 ÖжÏ, ÈùýÁã²ÉÑùÓëPWMͬ²½, ±Ü¿ªPWM¸ÉÈÅ
                        }
                        }
                }

                if(B_500ms)        //500msʱ϶
                {
                        B_500ms = 0;
                        if(B_RUN)        P_LED = 0;        //LEDָʾµÆÁÁ
                        else                P_LED = ~P_LED;        //LEDָʾµÆÉÁ˸, ´ý»ú
                }
        }
}
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:105
  • 最近打卡:2025-10-15 07:48:38
已绑定手机

2

主题

25

回帖

448

积分

中级会员

积分
448
发表于 2025-9-18 15:13:30 | 显示全部楼层
lyag*** 发表于 2025-9-18 11:43
/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI. ...

兄弟啊,STC8H1K08是没有TIMER3/TIMER4的。要用1K08,要把T3与T4的中断改到T1/T2上去
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:371
  • 最近打卡:2025-10-14 20:30:53

13

主题

114

回帖

241

积分

中级会员

积分
241
发表于 2025-9-18 19:32:12 | 显示全部楼层
优特*** 发表于 2025-9-18 15:13
兄弟啊,STC8H1K08是没有TIMER3/TIMER4的。要用1K08,要把T3与T4的中断改到T1/T2上去 ...

那我还是改用STC8H8K64U吧,免得改动太大。不过好像引脚对不上,我再仔细看看
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:371
  • 最近打卡:2025-10-14 20:30:53

13

主题

114

回帖

241

积分

中级会员

积分
241
发表于 2025-9-18 19:40:03 | 显示全部楼层
优特*** 发表于 2025-9-18 15:13
兄弟啊,STC8H1K08是没有TIMER3/TIMER4的。要用1K08,要把T3与T4的中断改到T1/T2上去 ...

谢谢大佬,我这两天重新画一块板子试试
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:105
  • 最近打卡:2025-10-15 07:48:38
已绑定手机

2

主题

25

回帖

448

积分

中级会员

积分
448
发表于 2025-9-18 20:01:52 | 显示全部楼层
不用重新画板的。定时器在程序里改一下就是了
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-16 05:50 , Processed in 0.140981 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表