⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是一个车用电机调速器的AVR单片机的整套C语言的源代码
💻 C
字号:
/********************************************************************************************************
* 文 件 名 : main.c
* 程 序 员 : (XieZhiJun) hncsxzj@sohu.com
*            (c) Copyright 2007-2007, XieZhiJun
*                       All Rights Reserved
* 创建日期 : 
* 说    明 : 
* 修改日期 :
* 修改版本 :
* 说    明 :
********************************************************************************************************/


#define  APP_GLOBALS
#include "includes.h"


static void AppInit   (void);                     // 当前项目应用相关的变量 信号量等非硬件初始化
static void McuInit   (void);                     // 硬件相关 当前项目应用初始化
static void IoInit    (void);                     // 初始化 IO

const INT8U drvPatterns[2][16]={
 {PDP0,  PDD0,  PDP1,  PDD1,  PDP2,  PDD2,  PDP3,  PDD3,  PDP4,  PDD4,  PDP5,  PDD5,  PDP6,  PDD6,  PDP7,  PDD7},
 {PDP7,  PDD7,  PDP6,  PDD6,  PDP5,  PDD5,  PDP4,  PDD4,  PDP3,  PDD3,  PDP2,  PDD2,  PDP1,  PDD1,  PDP0,  PDD0},
};


register volatile INT8U BMotor asm("r14"); 
/********************************************************************************************************
* 功 能 : 主引导函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/

static void AppInit   (void)
{
    TmrInit();                                    // 软调度器初始化
    MCPinInit();
}

/********************************************************************************************************
* 功 能 : 主引导函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
void MotorSTask(void)
{
    PWMOpen();
    PWMSetDucy(999,50);
    HallSensor();
    TmrStop(MotorS_TASK_PRIO);                       // 停止任务
}

void PpmTask(void)
{
    INT16U Ppm;
    cli();
    Ppm = ESCBuf.Dm.ICPPpm;
    sei();
    if((Ppm>800)&(Ppm<2200)){
        if(Ppm < ESCBuf.Dm.GasLow){
            Ppm = ESCBuf.Dm.GasLow;
        }else if(Ppm > ESCBuf.Dm.GasHigh){
            Ppm = ESCBuf.Dm.GasHigh;
        }
        if(GETBIT(BMotor,BMTURN)){    // 是否为单向
            if(GETBIT(BMotor,BMF)){   // 手动方向改变标志位
                SETBIT(BMotor,BMDDR); // 设物理转动方向
            }else{
                CLRBIT(BMotor,BMDDR);
            }
            PWMSetDucy(ESCBuf.Dm.GasHighLow,(Ppm - ESCBuf.Dm.GasLow));            
        }else{
            
            if(Ppm >= ESCBuf.Dm.GasMiddleH){
                CLRBIT(BMotor,BMDDR);
                SETBIT(BMotor,BMBRAKEEN);
                PWMSetDucy(ESCBuf.Dm.GasHighMiddleH,(Ppm-ESCBuf.Dm.GasMiddleH)); 
            }else if(Ppm <= ESCBuf.Dm.GasMiddleL){
                if(GETBIT(BMotor,BMBRAKE)){
                }else{
                    SETBIT(BMotor,BMDDR);
                    PWMSetDucy(ESCBuf.Dm.GasLowMiddleL,(ESCBuf.Dm.GasMiddleL-Ppm)); 
                }
            }else{
                PWMSetDucy(ESCBuf.Dm.GasHighLow,0); 
            }
        }
    }else{
        PWMSetDucy(ESCBuf.Dm.GasHighLow,0);
    }
}


int main (void)
{
    AppInit();                                    // 应用初始化 主要是变量或信号量 消息等
    McuInit();                                    // MCU 所有应用的初始化内容
    TmrCfgFnct(BEG_TASK_PRIO,    BegTask,1);      // 启动任务
    
    TmrCfgFnct(LED_TASK_PRIO,    LedTask,20);     //
    TmrCfgFnct(MotorS_TASK_PRIO, MotorSTask,4);   //
    TmrCfgFnct(PPM_TASK_PRIO,    PpmTask,1);     // 
    TmrCfgFnct(TST_TASK_PRIO,    HallSensorTask,200);       // 

    TmrStart(BEG_TASK_PRIO);                      // 启动启动任务

    b10MSFlg = 0;                                 //
    
    BMotor               = B0000_0110;
    ESCBuf.Dm.GasLow     = 1000;
    ESCBuf.Dm.GasHigh    = 2000;
    ESCBuf.Dm.GasMiddle  = 1500;
    ESCBuf.Dm.GasMiddleH = 1550;
    ESCBuf.Dm.GasMiddleL = 1450;

    ESCBuf.Dm.GasHighLow     = ESCBuf.Dm.GasHigh - ESCBuf.Dm.GasLow;     // 油门宽度
    ESCBuf.Dm.GasHighMiddleH = ESCBuf.Dm.GasHigh - ESCBuf.Dm.GasMiddleH; // 油门高位宽度
    ESCBuf.Dm.GasLowMiddleL  = ESCBuf.Dm.GasMiddleL - ESCBuf.Dm.GasLow;  // 油门低位宽度
    
    sei();                                        // 开启全局中断
    
    while (1) {
         if (b10MSFlg) {
            b10MSFlg = 0;
            TmrTask();
        }
    }
    return 0;
}


/********************************************************************************************************
* 功 能 : 硬件 软件环境配置函数 包含子部分定义 详细见各自的定义函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/

static void McuInit (void)
{
    IoInit ();                                    // 单片机IO初始化
//    ADCInit();                                    // ADC初始化

    Timer0Init();                                 // 未使用
    Timer1Init();                                 // PWM,ppm输入
    Timer2Init();                                 // 软调度器时间定时在此
    PWMInit();
    ICPInit();

}


/********************************************************************************************************
* 功 能 : 硬件 软件环境配置函数  IO 状态配置
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/

static void IoInit      (void)
{
    DDRB  = B0000_0110;                           //
    PORTB = B1111_1111;                           //

    DDRC  = B0000_1000;                           // 
    PORTC = B1111_0111;                           // 

    DDRD  = PDD0;                                 //
    PORTD = PDP0|HALL_MASK;                       // 
}


/********************************************************************************************************
* 功 能 :
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/

void BegTask (void)
{
    TmrStart(LED_TASK_PRIO);                      // 启动任务
    
    TmrStart(MotorS_TASK_PRIO);                   // 启动任务
    TmrStart(TST_TASK_PRIO);                      // 启动任务
    TmrStart(PPM_TASK_PRIO);                      // 启动任务
    TmrStop(BEG_TASK_PRIO);                       // 停止任务
}

/********************************************************************************************************
* 功 能 : 测试任务
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/

void LedTask (void)
{
    INVERTBIT(GLED_PORT,GLED);
}
/********************************************************************************************************
* 功 能 : 测试任务
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/

void HallSensorTask (void)
{
}



/********************************************************************************************************
*                                             End of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -