📄 drives.c
字号:
//*************************************************************************
//* *
//* **********************驱动程序************************* *
//* *
//*************************************************************************
#include "includes.h"
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//系统时间。
unsigned long ul_SystemTime=0;
//*************************************************************************
//* *************************IO口初始化************************ *
//*************************************************************************
void vIOPortInit(void)
{
DDRA=0xFF; //PROT A 键盘输入
PORTA=0xFF;
DDRB=0xFF;
PORTB=0x55;
}
//*************************************************************************
//* *************************锁相环初始化*********************** *
//*************************************************************************
void vPLLInit(void)
{ //BUS-CLOCK=PLL-CLOCK/2=32M
REFDV = 1; // set the REFDV register 16M*2*(3+1)/(1+1)=64M
SYNR =3; // set the SYNR register to give us a 64 MHz PLL-clock.
asm nop // nops required for PLL stability.
asm nop
asm nop
asm nop
while ((CRGFLG&0x08)==0); // wait here till the PLL is locked.
CLKSEL|=0x80; // switch the bus clock to the PLL.
}
//*************************************************************************
//* *************************定时器初始化*********************** *
//*************************************************************************
void vECTInit(void)
{
TIOS =0x00; //设为输入捕捉
TSCR1=0x80; //定时器使能
TSCR2=0x83; //允许定时器溢出中断,定时器时钟32M/(2^3)=4M
TCTL4=0xAA; //触发电平:下降沿
TIE =0x07; //开中断
TFLG1=0xFF; //清除中断标志
}
//*************************************************************************
//* ***************************AD转换初始化程序**************** *
//*************************************************************************
void vADInit(void)
{
//********************************ATD0设置*********************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<控制寄存器2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//上电,标志位快速清零,忽略外部触发,执行一次停止,中断禁止。
ATD0CTL2 = (ATD0CTL2_AFFC_MASK | ATD0CTL2_ADPU_MASK);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<控制寄存器3>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//转换序列长度为1,FIFO模式,Freeze模式下继续转换。|ATD0CTL3_FIFO_MASK
ATD0CTL3 = (ATD0CTL3_S1C_MASK);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<控制寄存器4>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//8位精度,2AD采样周期,采样长度8。
//ATDClock=[BusClock*0.5]/[PRS+1] ; PRS=15, divider=32
ATD0CTL4 =(ATD0CTL4_SRES8_MASK|ATD0CTL4_PRS0_MASK);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<控制寄存器5>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//右对齐无符号,扫描模式连续采样,单通道采样//多通道采样|ATD0CTL5_MULT_MASK。
ATD0CTL5 = (ATD0CTL5_DJM_MASK|ATD0CTL5_SCAN_MASK);
//<<<<<<<<<<<<<<<<<<<<<<<<<<禁止数字输入缓冲>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ATD0DIEN=0x00;
//********************************ATD1设置*********************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<控制寄存器2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//上电,标志位快速清零,忽略外部触发,执行一次停止,中断禁止。
ATD1CTL2 = (ATD1CTL2_AFFC_MASK | ATD1CTL2_ADPU_MASK);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<控制寄存器3>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//转换序列长度为1,FIFO模式,Freeze模式下继续转换。|ATD0CTL3_FIFO_MASK
ATD1CTL3 = (ATD1CTL3_S1C_MASK);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<控制寄存器4>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//8位精度,2AD采样周期,采样长度8。
//ATDClock=[BusClock*0.5]/[PRS+1] ; PRS=15, divider=32
ATD1CTL4 =(ATD1CTL4_SRES8_MASK|ATD1CTL4_PRS0_MASK);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<控制寄存器5>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//右对齐无符号,扫描模式连续采样,单通道采样//多通道采样|ATD0CTL5_MULT_MASK。
ATD1CTL5 = (ATD1CTL5_DJM_MASK|ATD1CTL5_SCAN_MASK);
//<<<<<<<<<<<<<<<<<<<<<<<<<<禁止数字输入缓冲>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ATD1DIEN=0x00;
}
//*************************************************************************
//* *************************PWM初始化************************* *
//*************************************************************************
void vPWMInit(void)
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//禁止PWM输出
PWME=0x00;
//<<<<<<<<<<<<<<<<<<<<<<<<<<PWM控制寄存器>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//01,23,45通道级联
PWMCTL=PWMCTL_CON01_MASK|PWMCTL_CON23_MASK|PWMCTL_CON45_MASK;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<输出极性>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//通道01的输出极性为正极性,23的输出极性为正极性,45的输出极性为负极性
PWMPOL=PWMPOL_PPOL1_MASK|PWMPOL_PPOL3_MASK;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<对齐方式>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//左对齐
PWMCAE=0x00;
//<<<<<<<<<<<<<<<<<<<<<<<<<<PWM时钟设置>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//时钟源为:CLOCKA,CLOCKB
PWMCLK=0x00;
//PWM时钟CLOCKA,CLOCKB频率均为:32MHz/8=4MHz
PWMPRCLK=0x33;
//<<<<<<<<<<<<<<<<<<<<<<直流电机的周期和占空比设定>>>>>>>>>>>>>>>>>>>>>>>>
MOTOR_PER1=MOTOR_PERIOD; //4MHz/MOTOR_PERIOD=200
MOTOR_DTY1=MOTOR_DTY_CENTER; //MOTOR_DTY_CENTER/MOTOR_PERIOD=50%
MOTOR_PER2=MOTOR_PERIOD; //4MHz/MOTOR_PERIOD=200
MOTOR_DTY2=MOTOR_DTY_CENTER; //MOTOR_DTY_CENTER/MOTOR_PERIOD=50%
//<<<<<<<<<<<<<<<<<<<<<<舵机的周期和占空比设定>>>>>>>>>>>>>>>>>>>>>>>>>>>>
STEER_PER=STEER_PERIOD; //4MHz/STEER_PERIOD=100
STEER_DTY=STEER_DTY_CENTER;//STEER_DTY_CENTER/STEPMOTOR_PERIOD=7.5%
}
//*************************************************************************
//* *************************系统初始化************************ *
//*************************************************************************
void vInitialize(void)
{
DisableInterrupts;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<IO口初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vIOPortInit();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<锁相环初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vPLLInit();
//<<<<<<<<<<<<<<<<<<<<<<<<<<定时器初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vECTInit();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<串口初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vUARTInit();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<AD初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vADInit();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<PWM初始化>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
vPWMInit();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<开中断宏定义>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EnableInterrupts;
uc_CarState=STATE_START;
vCarStart();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<输出初始化信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
printp("\nInitialize is successful!");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -