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

📄 hutil.c

📁 全国智能车大赛的motor测试程序
💻 C
字号:
#include <mc9s12dg128.h>

/*
 * 串口通信初始化
 */
void uart_init(void) {    
    SCI0CR2_TE = 1;             /* 使能发送和接受 */
    SCI0CR2_RE = 1;
    SCI0CR2_RIE = 1;            /* 使能接受中断 */
    
    SCI0BDH = 0x00;
    SCI0BDL = 0x9C;            /* 9600 */
}

/*
 * 发送一个字节
 */
void print_byte(unsigned char data) {
    while(!SCI0SR1_TDRE);
    SCI0DRL = data;      
}

/* 
 * 发送二进制数据
 */
void print_hex(unsigned char* data,int size) {
    int i;	
    unsigned char* buffer;																			
        
    buffer = data;
    for(i=0;i<size;i++) {
      while(!SCI0SR1_TDRE);
      SCI0DRL = *buffer++;       
    }
}

/*
 * 发送字符串数据
 */
void print_string(char* str) {
    char* buffer;
    
    buffer = str;
    while(*buffer) {
      while(!SCI0SR1_TDRE);
      SCI0DRL = *buffer++;       
    }
}

/* 
 * 初始化PA0,PA1以及单片机的AD模块
 */
void sensor_init(void) {
    /*
     * A/D模块初始化
     */     
    ATD0CTL2_ADPU = 1;          /* 启动A/D模块电源 */
    ATD0CTL2_AFFC = 1;					/* 自动清除转换完成标志位 */
    ATD0CTL2_AWAI = 0;    			/* Debug模式下继续转换 */
    ATD0CTL2_ASCIE = 0;         /* 禁止中断 */
    ATD0CTL2_ASCIF = 0;         /* 转换完成标志位 */
    ATD0CTL2_ETRIGE = 0;				/* 禁止外部触发 */
   
    ATD0CTL3_S8C = 1;           /* 8路转换通道 */
    ATD0CTL3_FIFO = 0;          /* 结果寄存器对应于转换队列 */
    ATD0CTL3_FRZ0 = 0;
    ATD0CTL3_FRZ1 = 1;          /* Debug时完成当前的转换 */
   
    ATD0CTL4_SRES8 = 1;         /* 8位转换结果 */
    ATD0CTL4_SMP0 = 0;
    ATD0CTL4_SMP1 = 1;  				/* 二次采样时间,8个A/D周期 */
    
    ATD0CTL4_PRS0 = 0;
    ATD0CTL4_PRS1 = 0;
    ATD0CTL4_PRS2 = 0;
    ATD0CTL4_PRS3 = 1;          /* A/D时钟周期 25M/18 */
    ATD0CTL4_PRS4 = 0;    
    
    ATD0CTL5_DJM = 0;           /* 数据左对齐 */
    ATD0CTL5_DSGN = 0;          /* 结果为Unsigned型数据 */
    ATD0CTL5_SCAN = 0;          /* 单次转换 */
    ATD0CTL5_MULT = 1;					/* 多通道采样 */
    ATD0CTL5_Cx = 0x00;         /* 从通道0开始采样 */
    ATD0DIEN = 0xFF;						/* 使能通道0-7 */
    
    /*
     * PA I/O口初始化
     */
    DDRA_BIT0 = 1;              /* Output */
    DDRA_BIT1 = 1;
    
    PORTA_BIT0 = 0;
    PORTA_BIT1 = 0;
}

/*
 * 读入16个端口的数据
 * dataout - 16字节的unsigned char数组,用于存放各个端口的电压输出
 */
void sensor_input(unsigned char* dataout) {
    unsigned char* buffer;
    
    /*
     * 第一个8路通道转化序列
     */
    PORTA_BIT1 = 0;    
    ATD0CTL5_Cx = 0x00;
    buffer = dataout + 7; 
    while(ATD0STAT1 != 0xFF);   /* 等待转换序列完成 */     
    *buffer-- = ATD0DR0H;
    *buffer-- = ATD0DR1H;
    *buffer-- = ATD0DR2H;
    *buffer-- = ATD0DR3H;
    *buffer-- = ATD0DR4H;
    *buffer-- = ATD0DR5H;
    *buffer-- = ATD0DR6H;
    *buffer-- = ATD0DR7H;

    /*
     * 第二个8路通道转化序列
     */
    PORTA_BIT1 = 1;    
    ATD0CTL5_Cx = 0x00;
    buffer = dataout + 15;
    while(ATD0STAT1 != 0xFF);   /* 等待转换序列完成 */ 
    *buffer-- = ATD0DR0H;
    *buffer-- = ATD0DR1H;
    *buffer-- = ATD0DR2H;
    *buffer-- = ATD0DR3H;
    *buffer-- = ATD0DR4H;
    *buffer-- = ATD0DR5H;
    *buffer-- = ATD0DR6H;
    *buffer-- = ATD0DR7H;
}

/*
 * 初始化后轮直流电机,包括pwm及PA口数据
 */
void back_motor_init() {
    /*
     * PWM 3 初始化
     */
    PWME_PWME2 = 0;             /* 禁止2,3 PWM输出*/
    PWME_PWME3 = 0;
    PWMPOL_PPOL3 = 1;           /* 3的输出先从高电平开始(达到预制值后变为低电平) */
    PWMCLK_PCLK3 = 0;           /* B 作为PWM3的时钟源 */
    PWMPRCLK_PCKB = 1;          /* 时钟源B的频率为 BusClock/2 */  
    PWMCAE_CAE3 = 0;            /* 单极性PWM */
    PWMCTL_CON23 = 1;           /* 2,3 合成16位PWM发生器 */
		
    PWMCNT2 = 0;                /* 2,3计数器初始化 */
    PWMCNT3 = 0;
    
    /* 
     * PWM周期: 总线频率为25M, B频率为 25M/2 ,设定PWM频率为12.5M/1250 = 10K
     * 即将33886的工作频率设置为10K (1250 = 0x04E2)
     * 实际测试为9.6K左右
     */
    PWMPER23 = 0x04E2;            
    PWMDTY23 = 0x0000;
       
    /*
     * PA 口初始化
     */
    DDRA_BIT2 = 1;						  /* 设置 PA2 为Output */
    DDRA_BIT4 = 1;						  /* 设置 PA4 为Output */
    DDRA_BIT5 = 1;						  /* 设置 PA5 为Output */
    
    PORTA_BIT2 = 0;             /* PA2 置 Low*/
    PORTA_BIT4 = 1;             /* PA4 置 High*/
    PORTA_BIT5 = 0;             /* PA5 置 Low*/
    
    DDRJ_DDRJ0 = 0;
    DDRJ_DDRJ1 = 0;
}

/*
 * 舵机pwm信号register初始化
 */
void helm_motor_init() {
    PWME_PWME0 = 0;             /* 禁止0,1 PWM输出*/
    PWME_PWME1 = 0;
    PWMPOL_PPOL1 = 1;           /* 1的输出先从高电平开始(达到预制值后变为低电平) */
    PWMCLK_PCLK1 = 1;           /* SA 作为PWM1的时钟源 */
    PWMPRCLK_PCKA = 2;          /* 时钟源A的频率为 BusClock/4 */  
    PWMCAE_CAE1 = 0;            /* 单极性PWM */
    PWMCTL_PFRZ = 1;            /* 仿真时停止输出 */
    PWMCTL_PSWAI = 0;
    PWMCTL_CON01 = 1;           /* 0,1 合成16位PWM发生器 */
    
    PWMSCLA = 0x01;             /* Clock SA = Clock A / 2 */
    PWMCNT1 = 0;                /* 0,1计数器初始化 */
    PWMCNT0 = 0;
    
    /* 
     * PWM周期: 总线频率为25M, SA频率为 25M/8,PWM 频率为18ms,则周期数为 
     * 18*0.001*25*10e6/8 = 56250 = 0xDBBA
     * 高电平时间为1-2ms , 其对应的值为:3125-6250 (0x0C35-0x186A)
     * (1.5ms 时为 0x124F ) 
     */
    PWMPER01 = 0xDBBA;            
    PWMDTY01 = 0x0E38;
    
    PWMSDN_PWM7ENA = 0;         /* 禁用PWM Shutdown Register */
}																								
																					 
/*
 * 用于测试舵机
 */			
void helm_motor_test() {
    long delay;
    int pwmup = 1;
    
    for(;;) {
      for(delay=2000;delay>0;delay--);
      
      if(pwmup)
        PWMDTY01++;
      else
        PWMDTY01--;
      
      if(PWMDTY01>0x1200 || PWMDTY01<0x0C35)
        pwmup = !pwmup;
    }
}

⌨️ 快捷键说明

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