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

📄 target.c

📁 汽车测功机源肛码.单片机用的是LPC2104. 实现测速,对涡流机的控制,马达的控制.
💻 C
📖 第 1 页 / 共 2 页
字号:
{
    PINSEL0 |= 0x00200000;          // 设定TMR1抓取通道0
    
    T1IR    = 0xFFFFFFFF;           // 清除TMR1的所有中断标识
    T1CCR   = 0x05;                 // 设定TMR1抓取通道0的上升沿,并产生中断(速度) CAP1.0
    
    
    T1TC    = 0x0;                  // TMR1定时器清0
    T1TCR   = 0x01;                 // 开TMR1
}

/*********************************************************************************************************
** 函数名称: PWMInit()
** 功能描述: PWM功能初始化
**           
** 输 入  : 无
** 输 出  : 无
** 全局变量: 无
** 调用模块: IGBT_GetPeriod()
**           IGBT_GetWidth()
** 说    明:
** 作 者: 周川福
** 日 期: 2006-04-19
**-------------------------------------------------------------------------------------------------------
** 修 改: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void PWMInit(void)
{
    PINSEL0 = (PINSEL0 & 0xFFFF3FFF) | (2 << 14);

    PWMIR   = 0xFFFFFFFF;           // 清除PWM中断标识
    PWMTC   = 0x00;                 // PWM定时器清零

    PWMPCR  = 1 << 10;              // 使能PWM2,模式为单边沿控制
    
//    PWMMCR  = 0x0B;                 // PWMMR0匹配时产生中断并复位PWMTC,PWMMR1匹配时产生中断
    PWMMCR  = 0x02;                 // PWMMR0匹配时复位PWMTC,

    PWMMR0  = IGBT_GetPeriod();     // PWM(IGBT)控制周期

    PWMMR2  = 0x00;                 // PWM(IGBT)占空比,也就是IGBT的导通时间

    PWMTCR  = 0x01;                 // 启动PWM定时器
}

/*********************************************************************************************************
** 函数名称: InitialiseUART0
** 功能描述: 设置串口0 
** 输 入: bps:波特率 19200
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 饶阳胜
** 日 期: 05-6-11
** 修改原因: 增加中断, 关闭FIFO
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InitUART0(uint32 bps)
{   
    uint16 Fdiv;

    PINSEL0 = (PINSEL0 & 0xFFFFFFF0) | UART0_COMMT; // 选择管脚为UART0
    U0LCR = 0x80;                                   // 允许访问分频因子寄存器
    Fdiv = (Fpclk / 16) / bps;                      // 设置波特率
    U0DLM = Fdiv / 256;
    U0DLL = Fdiv % 256;
    U0LCR = 0x03;                                   // 禁止访问分频因子寄存器
                                                    // 且设置为8,1,n
    U0IER = RV_ENABLE;                              // 使能接收中断
}

/*********************************************************************************************************
** 函数名称: VICInit
** 功能描述: 向量中断控制器初始化
** 输   入: 无
**
** 输   出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作   者: 陈明计
** 日   期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:   饶阳胜
** 日   期: 05-5-23
** 修改原因: 增加TMR1中断处理
**------------------------------------------------------------------------------------------------------
** 修改人:   饶阳胜
** 日    期: 05-6-24
** 修改原因: 增加I2C中断处理
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void VICInit(void)
{
    void IRQ_Handler(void);                         // 声明外部非向量中断函数
    void Timer0_Handler(void);                      // 声明外部TMR0中断处理函数
    void Timer1_Handler(void);                      // 声明TMR1中断处理函数
    void Uart0_Handler(void);                       // 声明外部UART0处理函数
    void I2c_Handler(void);                         // 声明I2C中断处理函数
    void PWM_Handler(void);                         // 申明PWM输出处理函数

    VICVectAddr = 0;
    VICIntEnClr = 0xFFFFFFFF;                       // 关闭所有中断
    VICIntSelect = 0x0;                             // 所有中断为IRQ中断

    VICDefVectAddr = (INT32U)IRQ_Handler;           // 得到非向量中断处理入口
    VICVectAddr0   = (INT32U)Timer0_Handler;        // 得到TMR0中断处理入口
    VICVectAddr5   = (INT32U)Timer1_Handler;        // 得到TMR1中断处理入口
    VICVectAddr6   = (INT32U)PWM_Handler;           // 得到PWM中断处理入口
    VICVectAddr7   = (INT32U)Uart0_Handler;         // 得到UART0中断处理入口
    VICVectAddr12  = (INT32U)I2c_Handler;           // 得到I2C中断处理程序入口

    VICVectCntl0   = (0x20 | 0x04);                 // 分配TMR0的中断优先级为0
    VICVectCntl5   = (0x20 | 0x05);                 // 分配TMR0的中断优先级为5
    VICVectCntl6   = (0x20 | 0x08);                 // 分配PWM的中断优先级为6
    VICVectCntl7   = (0x20 | 0x06);                 // 分配UART0的中断优先级为7
    VICVectCntl12  = (0x20 | 9);                    // 分配I2C的中断优先级为12

    VICIntEnable |= 1 << 4;                         // 使能TMR0中断 (为方便调试,把中断关掉)
    VICIntEnable |= 1 << 5;                         // 使能TMR1中断
//    VICIntEnable |= 1 << 8;                         // 使能PWM中断
    VICIntEnable |= 1 << 6;                         // 使能UART0中断
}

/*********************************************************************************************************
** 函数名称: TargetInit
** 功能描述: 目标板初始化代码,在需要的地方调用,根据需要改变
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 无 
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 饶阳胜
** 日 期: 05-5-22
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TargetInit(void)
{
    IODIR = WORK_SHOW | AD_RC | AD_BYTE | OUT_CONTROL;      // 定义输出引脚
    IODIR |= ZSSS | ZSXJ | MOTOR| WHEEL_1 | WHEEL_2 | TRANS_MOTOR;
 
    OS_ENTER_CRITICAL();

    srand((uint32) TargetInit);
    
    
    IGBT_Init();                                            // IGBT初始化

    Timer0Init();                                           // Timer0初始化 
    Timer1Init();                                           // Timrer1初始化 
    PWMInit();                                              // PWM初始化
    InitUART0(19200);                                       // 设置串行口 

    set_control_value = 0;                                  // 设定控制值清0
    force_dema_point  = 0;                                  // 力标定点清0
    parameter[SPEED]    = 0;
    parameter[FORCE]    = 0;
    parameter[POWER]    = 0;
    parameter[JSD]      = 0;
    parameter[DISTANCE] = 0;

    ScSpeed          = 0;
    speed_set_value  = 0;
    force_set_value  = 0;
    power_set_value  = 0;
    adi_sum          = 0;
    adi_times        = 0;
    adi_value        = 0;
    times            = 0;

    G_PulseCount     = 0;
    G_Kp             = 0;
    G_Ki             = 0;
    G_Kd             = 0;
    G_Kc             = 0;

    OS_EXIT_CRITICAL();
}

/*********************************************************************************************************
** 函数名称: TargetResetInit
** 功能描述: 调用main函数前目标板初始化代码,根据需要改变,不能删除
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void TargetResetInit(void)
{
#ifdef __DEBUG_RAM    
    MEMMAP = 0x2;                   //remap
#endif

#ifdef __DEBUG_FLASH    
    MEMMAP = 0x1;                   //remap
#endif

#ifdef __IN_CHIP    
    MEMMAP = 0x1;                   //remap
#endif

/* 设置系统各部分时钟 */
    PLLCON = 1;
#if (Fpclk / (Fcclk / 4)) == 1
    VPBDIV = 0;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
    VPBDIV = 2;
#endif
#if (Fpclk / (Fcclk / 4)) == 4
    VPBDIV = 1;
#endif

#if (Fcco / Fcclk) == 2
    PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
    PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
    PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
    PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
    PLLFEED = 0xaa;
    PLLFEED = 0x55;
    while((PLLSTAT & (1 << 10)) == 0);
    PLLCON = 3;
    PLLFEED = 0xaa;
    PLLFEED = 0x55;

/* 设置存储器加速模块 */
    MAMCR = 0;
#if Fcclk < 20000000
    MAMTIM = 1;
#else
#if Fcclk < 40000000
    MAMTIM = 2;
#else
    MAMTIM = 3;
#endif
#endif
    MAMCR = 2;

}

/********************************************************************************
* 函数名称: char* cpystr(char *src, char *dest, int pose, int count);
* 功    能: 把字符串src 拷贝到dest中,pose是拷贝的起始位置,count为拷贝的数量
* 入口参数: *src -- 原字符串
            *dest -- 目标字符串
            pose  -- 起始位置
            count -- 拷贝的数量
* 出口参数: char * -- 拷贝后字符串的地址指针
* 调用模块: 
*
* 全局变量: 
*           
*--------------------------------------------------------------------------------
* 设计者:   Hexen
* 日    期: 2006-9-24
* 说    明: 
********************************************************************************/
char* cpystr(char *src, char *dest, int pose, int count)
{
    int i,j;

    if( strlen(src) == 0 ) return NULL;

    j = 0;
    for(i = pose; i < (count + pose); i++) {
    
        dest[j++] = src[i];
        
    }
    dest[j] = 0;

    return dest;
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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