📄 hutil.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 + -