- 打卡等级:以坛为家I
- 打卡总天数:371
- 最近打卡:2025-10-14 20:30:53
中级会员
- 积分
- 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ָʾµÆÉÁ˸, ´ý»ú
}
}
}
|
|