飞思卡尔刹车过弯效果程序

合集下载

[控制类] 飞思卡尔智能车舵机调试工具

[控制类] 飞思卡尔智能车舵机调试工具

[控制类] 飞思卡尔智能车舵机调试工具舵机, 调试工具, 上位机, 飞思卡尔智能车今天在调试舵机,发现经常需要频繁地修改PWMDTYx,让舵机旋转到不同的角度,比如让舵机调零,测试舵机不同角度对应车轮的角度等等。

如果每次测试都要重新编译,不仅浪费时间,而且对芯片的寿命也有影响,于是想到了用VB编写一个调试舵机的上位机程序,通过串口与单片机通讯,来实现舵机的实时调节。

我把写好的程序放在附件里了,希望能给大家提供点帮助。

角度转换为高电平时间角度 -45 0 45 (anger/度)高电平时间 1000 1500 2000 (t/us)计算公式为:T = 1000 + (anger + 45) * (1000 / 90)该上位机程序可以通过串口与单片机进行通讯,实时改变舵机的角度。

通讯协议为:0xfe 0xMM 0xNN (其中0xfe为包头,0xMM为PWMDTYx高8位,0xN为PWMDTYx低8位)在串口中断中分三次接收,在第二次接收时保存数据到temp0中,在第三次接收到数据时将PWMDTY01= ((unsigned int)temp0 <<8) | RxData 就可以完成PWM改变输出了。

下位机程序如下:#include <hidef.h> /* common defines and macros */#include <MC9S12XS128.h> /* derivative information */#pragma LINK_INFO DERIVATIVE "mc9s12xs128"unsigned char RX=0,temp0;void uart_putchar(unsigned char ch){if (ch == '\n'){while(!(SCI0SR1&0x80)) ;SCI0DRL= 0x0d;return;}while(!(SCI0SR1&0x80)) ;SCI0DRL=ch;}static void PWM_Init(void){//SB,B for ch2367//SA,A for ch0145PWMCTL_CON01=1; //0和1联合成16位PWM;PWMCAE_CAE1=0; //选择输出模式为左对齐输出模式PWMCNT01 = 0; //计数器清零;PWMPOL_PPOL1=1; //先输出高电平,计数到DTY时,反转电平PWMPRCLK = 0X40; //clockA不分频,clockA=busclock=16MHz;CLK B 16分频:1MhzPWMSCLA = 8; //对clock SA 进行2*8=16分频;pwmclock=clockA/16=1MHz;PWMCLK_PCLK1 = 1; //选择clock SA做时钟源PWMPER01 = 20000; //周期20ms; 50Hz;(可以使用的范围:50-200hz) PWMDTY01 = 1500; //高电平时间为1.5ms;PWME_PWME1 = 1;}void setbusclock(void) //PLL setting{CLKSEL=0X00; //disengage PLL to systemPLLCTL_PLLON=1; //turn on PLLSYNR=1;REFDV=1; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;_asm(nop); //BUS CLOCK=16M_asm(nop);while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;CLKSEL_PLLSEL =1; //engage PLL to system;}static void SCI_Init(void) //SCI{SCI0CR1=0x00;SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable SCI0BDH=0x00; //busclk 8MHz,19200bps,SCI0BDL=0x1a SCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)//busclk 16MHz, 9600bps,SCI0BDL=0x68}interrupt 20 void SCI_Rx_IRS(void) //中断接收{unsigned char RxData;DisableInterrupts;if (SCI0SR1&0x20){RxData = SCI0DRL;switch(RX){case 0:if (RxData==0xfe) RX=1;break;case 1:temp0 = RxData;RX=2;break;case 2:PWMDTY01= ((unsigned int)temp0 <<8) | RxData;PORTB=~PORTB;RX=0;break;}uart_putchar(RxData);}EnableInterrupts;}void main(void){EnableInterrupts;setbusclock(); SCI_Init(); PWM_Init(); DDRB=0xff; for(;;) {}}。

飞思卡尔软件注意事项

飞思卡尔软件注意事项

飞思卡尔些许经验之软件设计------循迹基于电磁传感器,方向以及舵机调控基于B车模(仅供参考) 1、电感排布先说下各种排布类型电感的特点:左右竖直电感:对直角弯道十分敏感,可以清楚分辨出来十字弯与直角弯,但是对于曲率较大的S弯道会造成与直角弯道混淆。

在直角弯的时候左右电感差异非常大,可以较早判别出直角弯道,与左右水平电感结合可排除竖直电感对直角弯与大曲率S弯的误判左右水平电感:很适合判断直道以及小曲率弯道车子处在中心线的位置,但是对于曲率较大的S弯道与直角弯可能会造成左右判断相反的情况(即明明车子左偏赛道,但是根据电感差值却得出车子右偏赛道的结论),此时应该结合竖直电感或者斜电感来融合判断。

左右斜电感:对直角弯以及一切曲率的弯道敏感,缺点是过于敏感,若使用此电感差值作为误差偏移量会导致车子严重内切弯道,建议加入其余电感的权重,总体上不建议使用左右斜电感差值作为误差偏移量,但是作为一切弯道以及直道还有直角弯的方向判断是非常适合的。

另外应该注意的是此电感排布对于十字弯道会误判,这是由于十字弯道磁场排布的影响,但是可以与左右水平电感或左右竖直电感结合排除对十字弯道的误判。

中间水平电感:此电感非常适合用于误差偏移量的计算,即误差量=直道中心线值-实时值;用此方法得到的差值在弯道的时候只用稍稍加以处理就可平滑的咬中线过弯。

电感的排布基本上就这几种方式了,下边要说的是车子电感排布选择左右竖直电感加左右水平电感:本次比赛太原理工大学的电感排布,个人感觉过弯时对赛道误差偏移量的处理有较高要求,处理不好很有可能让车子严重内切赛道导致出界。

左右竖直电感加左右水平电感加中心水平电感:用中心水平电感获取赛道误差偏移量,方法参考上面的描述。

弯道方向判断用左右竖直电感。

直道方向判断用左右水平电感,直角预判用竖直电感,具体是若竖直电感左右差值达到一定程度了就看左右水平电感,若左右水平电感差值较小且左右电感值都较大,说明快要进入直角弯,否则说明在大曲率的S弯。

基于飞思卡尔MC9S12XS128芯片的智能车刹车系统的研究

基于飞思卡尔MC9S12XS128芯片的智能车刹车系统的研究
( 责任编辑 王雪芬 )
b r e a k ;
n t = 2 ; e a s e r a mp wa y : s p e e d wa
图 5 非理想刹车系统波形图
i f ( s p e e d _ e r r o r [ 1 ] < =2&&s p e e d _ 一 e r o r [ 1 j > = 一 2 )
r e t u r n;
此时也会对赛车的平稳运行 产生一定 的影 响, 根据软件算 法的描述 , 即每个 调节周期对 2路 P WM因素 , 故应在每个调节周
2 0 第 1 4年 3期 2月
江 苏科技信息 ・ 研究 与交流
N o . 3
Fe b r u a r y, 2 01 4
达到则停 止调节 ,若没有则 通过 P I D控 制算 法改变调节输 出
量 即反 向 P WM波 P P 3的 占空 比 z %继续调节 ,直 至通 过编码
稳性 ) 变化 , 随着每一调 节周期 的反馈 比较进 而对变化量参 数 改变后再进行控制输出 , 直 至赛车在进入下一赛道类型前平 稳 运行在预期速度 , 从 而达 到赛车在变速的过程 中依然快 速且平
稳运行的 目的 。
3 核 心 程序
Vo i d i me r r u p t s t o p

c a s e s t as h t : s p e e d wa n t = 5;
_
通过引入刹车系统实 现赛 车在高速运行情况 下的有效制
动, 减少 了“ 实 际线性变速 区” 的范 围以及赛车因速度过快却无
法控制而产生 的车体晃动 、 甩尾 、 漂移 等不稳定情况 的出现 , 从 而增加 了赛车能 以更快 的速度平稳跑完赛道 的可能性 , 也为 以 更快 速度且平稳 的完成 比赛提供 了更多 的可能 。

2011年飞思卡尔比赛程序

2011年飞思卡尔比赛程序

#include <hidef.h> /* common defines and macros */#include <mc9s12dg128.h> /* derivative information //引用头文件,通过该头文件将单片机的各寄存器转换为相对应的C语言的变量名*/#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"#define mid_direction 147 //设置舵机中间位置的占空比#define right_direction 0 //设置直线路程时的相对中间位置的变化量#define micro_direction 12 //设置转小弯时舵机相对中间位置的变化量#define deep_direction 19 //设置转大弯时舵机相对中间位置的变化量#define emergence_direction 22 //设置紧急情况时舵机转向#define direct_speed 14 //设置直线时输出到电机的占空比从而控制电机转速#define micro_speed 13 //设置小弯时电机转速#define deep_speed 11 //设置大弯时电机转速#define emergence_speed 10 //设置紧急情况时电机转速#define inter 5#define inter1 500 //通过设置该参数数值来调节每次采集轮速传感的脉冲时间#define speed_keep 0.4 //为轮速的比例因子,因使用效果不好最后取消使用#define speed_kd 0.1#define kp 0.5//#define kd 1.3 //下列的全局变量的设定,是为了在小车冲出赛道后仍能记住返回而设int turn_symbol; //转向标志,在信号分析程序中设置1时为向右转为-1时向左转float memory_direction; //记忆上次转向unsigned char signal;int error; //定义转向本次与中间位置的偏差int last_error; //定义上次转向与中间位置的偏差int mem_error; //记忆上次转向偏差int speed;int speed1;float kd;float speed_error;float speed_last_error;int speed_back; //轮速反回脉冲数int stop_symbol; // 停车标志int flag;void PLL_init(void) // 系统时钟的初始化,因当时摸索欠考虑,时钟初始化比较乱,需要改进{CLKSEL_PLLSEL=0; //选定外部时钟,为1时选择锁相环时钟时钟选择寄存器初始化CLKSEL=0 ; //选择外部晶振为时钟源PLLCTL_PLLON=0; //锁相环电路禁止;PLLCTL_PRE=1; //实时中断允许PLLCTL_PCE=1; //允许看门狗PLLCTL_AUTO=1; //选择高频宽带控制PLLCTL_SCME=1; //探测到外部时钟失效时产生自给时钟信号SYNR=8; //时钟合成寄存器初始化REFDV=0X07; //时钟分频寄存器初始化与上句为做实验时确定的参数与理论参数有差距,可重新设置//CLKSEL_PLLSEL=1 ; //选定锁相环时钟此句被注解掉PLLCTL_CME=1; //时钟监控允许锁相环控制寄存器初始化PLLCTL_PLLON=1;while(!CRGFLG_LOCK);//循环直到该位为1即时钟频率已稳定,CLKSEL_PLLSEL=1; //选定锁相环时钟}void PORTAB_init(void) //信号输入输出口的设置,较简单{DDRA=0X00; //设置A口输入 DDR寄存器置0为输入,置1为输出DDRB=0XFF;//设置B口为输出,作为信号指示PORTB=0X00;//初始化时设置为全亮,0亮1灭}void PWM_init(void) //脉宽调制模块的初始化。

飞思卡尔卡尔曼滤波程序

飞思卡尔卡尔曼滤波程序

卡尔曼滤波:以陀螺仪测量的角速度作为预测值的控制量,加速度传感器测量的角度作为观测值。

下面程序中angle_m为测量角度,gyro_m为测量角速度,gyro_m*dt为控制量。

以下程序是按卡尔曼滤波的五个公式来编写的。

X(k|k-1)=A X(k-1|k-1)+B U(k) (1)P(k|k-1)=A P(k-1|k-1) A’+Q (2)X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) (3)Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) (4)P(k|k)=(I-Kg(k) H)P(k|k-1) (5)对于单输入单输出系统,A、B、H、I不为矩阵且值都为1。

卡尔曼滤波参数的调整:其参数有三个,p0是初始化最优角度估计的协方差(初始化最优角度估计可设为零),它是一个初值。

Q是预测值的协方差,R是测量值的协方差。

对Q和R的设定只需记住,Q/(Q+R)的值就是卡尔曼增益的收敛值,比如其值为0.2,那么卡尔曼增益会向0.2收敛(对于0.2的含义解释一下,比如预测角度值是5度,角度测量值是10度,那么最优化角度为:5+0.2*(10-5)=6。

从这里可以看出,卡尔曼增益越小,说明预测值越可靠,最优化角度越接近预测值;相反的,卡尔曼增益越大,说明测量值越可靠,最优化角度越接近测量值)。

p0/(Q+R)反映收敛的快慢程度,该值设定越小,收敛越快,该值越大,收敛越慢(这里的p0是指初始最优角度值的协方差),因为卡尔曼增益收敛总的来说是很快的,所以该值设定大一点或小一点都没什么关系。

注:以下程序只用于说明算法,存在语法错误,初始的参数也是随意给定的。

x=0;/* 最优角度初值*/p=1;/* 最优角度对应协方差初值*/dt=0.02;Q=0.0025;R=0.25;void Kalman_Filter(float angle_m,float gyro_m) //gyro_m:gyro_measure{x=x+ gyro_m*dt; 等号右边的x表示上一次最优角度值,等号左边的x表示这一次的角度的预测值p=p+Q; 等号右边的p表示上一次最优角度值的协方差,等号左边的p表示这一次的角度预测值的协方差k=p/(p+R); k值为卡尔曼增益(k值每次计算都不一样,它会越来越趋近于Q/(Q+R)这个收敛值)x=x+k*( angle_m-x); 等号左边的x表示根据预测值和测量值计算出来的这一次的最优角度值(从这里可以看出,k越大,等号左边的最优值x与等号右边的测量值angle_m越接近;k越小,等号左边的最优值x与等号右边的预测值x越接近;)p=(1-k)*p; 等号左边的p表示这一次最优角度值的协方差}从上面的程序可以看出,卡尔曼滤波是一个递推过程,初始的最优角度值可设为x=0,初始最优角度值的协方差p一定不能设为零,dt是采样周期,Q 与R可共同决定卡尔曼增益收敛的大小。

飞思卡尔 赛车机械改动-关于出入弯时的推头

飞思卡尔 赛车机械改动-关于出入弯时的推头

驾驶技术之十一--关于出入弯时的推头(understeer)[正文]当发现遥控车在任何速度出入弯时, 都有明显的推头现像时, 很多时车手会实时把前后弹弓, anti-roll的设定加以改变, 去尝试解决这个推头的现像, 但有些时候改变了这些设定不一定可以解决问题, 这个推头的问题可能不是出于弹弓或anti-roll bar等设定的因素, 而是因为由前轮转弯动作所产生的前轮滚动阻力(rolling drag) 引起。

很多人会发现一个现像, 静止时当用手把前轮转动, 前轮会不停地自由转动(用前单向的情况下) , 但当用遥控器左右转变方向的时候, 前轮便会很快停止了自由转动, 但是如果不转变方向, 前轮很久才会停下来, 这个现像便说明了由转向所产生的(rolling drag) , 这个rolling drag的大少是直接决定于转向角度的大少, 及机械上的阻力。

转弯角度越大rolling drag便越大, understeer的情况便会越严重, 同时亦会大幅地减少出入弯的速度(注:前轮understeer的情况越严重, 浪费动力的情况也越严重, 这些浪费了的动力便转化成前车轮的热力及增加磨损度) , 有些车手, 便把转弯的角度加大试图去改善这个情况, 但转向角度越大understeer的情况便越严重, 结果前车轮温度上升了不少, 而且出入弯都不能快。

当发现有这种情况, 便要检视一下CVD及Bearing的动作是否畅顺, 是否很久没有作出维修?CVD有没有弯曲及CVD内的机械配件有没有磨损?还有CVD的角度是否太大?及在转弯尽角时车轮有没有撞到外围的东西?等等。

如果是用普通的T型狗骨, 便要考虑要不要改用CVD或是改变drive axle内用来顶着狗骨的o-ring的数目, O-ring数目的多少是会直接影响前轮转弯时的顺畅, 改完或维修之后, 便用手转动前轮及转方向去测定改善了的顺畅程度, 如果没有问题但车仍然是understeer , 这时才用其它的设定去调整, 当发现understeer时这个少少的检视, 可能会省回不少调车的时间。

飞思卡尔智能车软件环境使用简介

飞思卡尔智能车软件环境使用简介

CodeWarrior开发环境快速入门-程序下载CodeWarrior开发环境快速入门-工程创建1、运行CodeWarrior IDEa、选择开始>程序>CodeWarrior>CW for HC12V4.6---弹出菜单。

b、选择CodeWarrior IDE--IDE启动,同时弹出CodeWarrior窗口。

2、在IDE主菜单栏中,选择File>New–弹出新建窗口。

a、选择HC(S)12New Project Wizardb、在Project name文本框中,输入工程名—-工程创建后IDE会自动添加.mcp扩展名。

c、在Location文本框中输入工程保存的位置或者点击Set...浏览文件夹。

d、点击OK--弹出New Project Wizard–Page1。

点击Next--弹出New Project Wizard–Page2。

f、选择MC9S12DG128B。

g、点击Next--弹出New Project Wizard-Page3。

h、确保复选框C被选中。

i、点击Next–弹出New Project Wizard-Page4;用户可以选择是否用“Processor Expert”,由软件自动完成中断向量,外围模块初始化等工作。

j、选择Nok、点击Next–弹出New Project Wizard-Page5;用户可以选择是否将工程配置使用PC-lint。

l、选择Nom、点击Next–弹出New Project Wizard-Page6;用户可以选择启动代码的类型。

n、选择ANSI startup codeo、点击Next button--New Project Wizard-Page7;用户可以选择工程配置的浮点类型。

p、选择Noneq、点击Next--New Project Wizard-Page8;允许用户选择工程配置的内存模式。

r、选择Bankeds、点击Next button--New Project Wizard-Page9;允许用户工程配置的连接方式。

飞思卡尔 使用监控程序经行程序烧写、调试的方法说明—C语言编程版

飞思卡尔 使用监控程序经行程序烧写、调试的方法说明—C语言编程版

设置好以后就可以用了。
四、程序的下载 连接好串口线,打开设置好的超级终端,然后对单片机商店或者复位时,超级
终端就会出现以下文字: D-BUG V1.1 Tsinghua MAC All Right Reserved Type H for Help Type Any Key into Debug, Type H for Help 在刚刚上电或复位的 3 秒内,超级终端会检测串口,等待 PC 机端是否发送过来
使用监控程序经行程序烧写、调试的方法说明 C 语言编程版
对 MC9S12DG128 进行调试、程序烧写可以有两种方式:用 BDM 工具通过专门接 口进行和利用监控程序通过串口进行。BDM 方式是芯片厂商提供的调试、烧写方式, 在 DG128 芯片上留有管脚,通过仿真器将目标板和 PC 机相连,PC 机通过 Hiwave 程 序将程序通过仿真器烧写至单片机中。BDM 的一大特点是需要专门的仿真器和开发 环境,在没有仿真器或者 Hiwave 程序时就无法进行程序的烧写。
已有监控程序的单片机在运行时,首先运行的程序就是监控程序,监控程序首 先会等待 3 秒,同时查询串口是否接收到任何数据,若接收到数据,就进入调试状 态,通过指令进行程序烧写、调试;若 3 秒之内没有从串口上接收到数据,就去执 行用户烧写到单片机内的程序。
二、使用 Code Warrior 进行程序编写时的注意事项
改为
其他中断也是如此。
三、PC 机串口界面——超级终端
PC 机上使用的与单片机监控程序通信的软件是 Windows 自带的一个通信界面软 件——超级终端。超级终端的位置在 开始 -> 所有程序 -> 附件 -> 通讯 下,如 图。
打开超级终端后先要给此链接起名称,这个名称可以随意起。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

飞思卡尔刹车过弯效果程序#include &lt;hidef.h&gt; /* common defines and macros */ #include &lt;MC9S12XS128.h&gt; /* derivative information */#pragma LINK_INFO DERIVATIVE &quot;mc9s12xs128&quot;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*------------------sen_AD.h -----------------------------*/////////////////////////////////////////////////////////////#define MIDDLE 9083 //10100 //舵机中间值#define Mid_Revise 0 //舵机中间值校正#define Right_Edge -1140 //舵机右极限#define Left_Edge 1140 //舵机左极限#define SPEED_KP 12 //定义比例系数#define SPEED_KI 3 //定义积分系数#define SPEED_KD 2 //定义微分系数#define VV_DEADLINE 0x01 //速度PID,设置死区范围//#define VV_BANGBANG 20 //速度PID,BANGBANG控制#define V_BANGBANG -13 //速度PID,BANGBANG控制word VV_MAX;word V_MAX=99;word VV_MIN=0; //最小速度byte Num;//byte blank_flag;const byte speed[10][9]={{60,60,60,60,60,60,60,60,60}, /*0*/{42,42,39,37,37,37,37,37,35}, /*1*/{44,44,39,37,37,37,37,37,35}, /*2*/{45,45,45,45,40,37,35,35,35}, /*3*/{50,50,50,47,45,40,35,30,25}, /*4*/ //speed select mode{55,55,50,45,40,35,35,30,25}, /*5*/{60,60,55,57,45,42,35,34,20}, /*6*/{65,65,60,55,40,37,35,34,25}, /*7*/{70,70,65,60,55,45,38,34,25}, /*8*/{75,75,70,65,58,50,45,35,25}, /*9*/};///////////////////////////////////////////////////////////*------------------RUDDER and SENSOR-------------------*////////////////////////////////////////////////////////////*----------------传感器记忆位量共同体-------------------*/union{word Word;struct{word BIT0 :1; /*0*/word BIT1 :1; /*1*/word BIT2 :1; /*2*/word BIT3 :1; /*3*/word BIT4 :1; /*4*/word BIT5 :1; /*5*/word BIT6 :1; /*6*/word BIT7 :1; /*7*/word BIT8 :1; /*8*///word BIT9 :1; /*9*///word BIT10 :1; /*10*/}Bits;}Sensor;#define Psensor Sensor.Word#define N 9#define Count 9/////////////加权平均算法得出智能车偏离程度////////////#define ANp 10 //初始比例参数#define ANd 17 //微分参数//#define ANi 0#define Al 6byte SetPulse;static char Sen_Weight[N]={8,6,4,2,0,-2,-4,-6,-8};//0 1 2 3 4 5 6 7 8static word ad_adjust[N]={680,690,690,670,688,690,652,675,650};//模型车参数word ad[9]; //AD转换存储值struct RUD_PID //RUDDER 参数结构体{word Ap;byte Ad;//byte Ai;byte Alpha;char angerror; //转角偏差量char angderror; //相邻两次转角偏差求差char angprerror; //前一次转角偏差量char Ap_error; //当前转角偏差赋值判断量//int Ki_out; //积分输出量int Kd_out; //微分输出量int Kp_out; //比例输出量int servout; //转角输出量}RUD_PID;char Sen_W; //传感器赛道权重char Sen_Weighting; //黑线中心char Sen_FlagCount; //传感器标志位求和总量////////////////////////////////////////////////////*-------------------MOTOR-----------------------*////////////////////////////////////////////////////word Pulse; //脉冲累加/*-------------电机参数结构体-------------------*//*------------------------------------------------*/struct PID //定义结构体{int vi_Ref; //速度PID,速度设定值int vi_FeedBack; //速度PID,速度反馈值int vi_PreError; //速度PID,速度误差,,vi_Ref - vi_FeedBackint vi_PreDerror; //速度PID,前一次,速度误差之差,d_error-PreDerror; int v_Kp; //比例系数,Kp = Kpint v_Ki; //积分系数,Ki = Kp * ( T / Ti )int v_Kd; //微分系数,Kd = KP * Td * Tint vl_PreU; //PID输出值}PID;/*--------------拨码开关变量共同体声明--------------*/union{ //拨码开关速度选择byte Byte;struct{byte BIT0 :1; /*0*/byte BIT1 :1; /*1*/byte BIT2 :1; /*2*/byte BIT3 :1; /*3*/byte BIT4 :1; /*4*/byte BIT5 :1; /*5*/byte BIT6 :1; /*6*/byte BIT7 :1; /*7*/}Bits;}In_speed;/////////////////////////////////////////////////////////////////////////// /*-----------------------------------------------------------------------*/////////////////////////////////////////////////////////////////////////// static void SetBusCLK_24M(void){CLKSEL=0X00; // disengage PLL to systemPLLCTL_PLLON=1; // turn on PLLSYNR=0x00 | 0x02; // VCOFRQ[7:6];SYNDIV[5:0]// fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)// fPLL= fVCO/(2 ×POSTDIV)// fBUS= fPLL/2// VCOCLK Frequency Ranges VCOFRQ[7:6]// 32MHz &lt;= fVCO &lt;= 48MHz 00// 48MHz &lt; fVCO &lt;= 80MHz 01// Reserved 10// 80MHz &lt; fVCO &lt;= 120MHz 11REFDV=0x80 | 0x01; // REFFRQ[7:6];REFDIV[5:0]// fREF=fOSC/(REFDIV + 1)// REFCLK Frequency Ranges REFFRQ[7:6]// 1MHz &lt;= fREF &lt;= 2MHz 00// 2MHz &lt; fREF &lt;= 6MHz 01// 6MHz &lt; fREF &lt;= 12MHz 10// fREF &gt; 12MHz 11// pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV)// If POSTDIV = $00 then fPLL is identical to fVCO (divide by one)._asm(nop); // BUS CLOCK=16M_asm(nop);while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;CLKSEL_PLLSEL =1; //engage PLL to system}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void port_init(void){//DDRA|=0x00;//DDRT_DDRT0=0; //PT0口作为速度调试输入DDRB=0xf1;PORTB=0xff;}//////////////////////////////////////////////////////////////////////////////////AD采样初始化//////////////////////////////////////////////////////////////////////////////////////void AD0_Init(void){ATD0CTL1=0x20; //7:1-外部触发,65:00-8位精度,01-10位精度,10-12位精度,11-保留,AD转换最大数值为1024;4:放电,3210:chATD0CTL2=0x40; //禁止外部触发, 中断禁止//ATD0CTL2=0x42; //禁止外部触发, while(!ATDSTAT0_SCF)//中断使能,启动AD转换ATD0CTL3=0x80; //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转ATD0CTL4=0x03; //765:采样时间4个AD时钟周期,每10us转换一次//ATDClock=[BusClock*0.5]/[PRS+1]=3MHzATD0CTL5=0x30; //6:0特殊通道禁止,5:1连续转换,4:1多通道轮流采样//ATD0CTL5_MULT=1;ATD0DIEN=0x00; //禁止数字输入}/////////////////////////////////////////////////////////*----------------------RUDDER ini---------------------*/////////////////////////////////////////////////////////void PWM01_Init(void) //舵机输出端口PWM7设置{PWME_PWME1 = 0; //PWM1输出关闭PWMCTL_CON01=1; //0/1级联PWMPRCLK = 0; //选择SCLAPWMSCLA = 2; //SCLB时钟24M/(2*PWMSCLB)PWMCLK_PCLK1 = 1; //PTP1选择ClockSA=6MhzPWMPOL_PPOL1=1; //极性选择:高电平输出PWMCNT01 = 0; //PWMDTY01 = MIDDLE; //9083;占空比=[(PEMDTY01+1)/(PEMPER01+1)]*100%=16.2%PWMPER01 = 56000; //舵机输出频率=[6M/(PWMPER01+1)]=107HzPWME_PWME1 = 1; //PWME1引脚PTP1为输出}////////////////////////////////////////*-------电机输入端口选择PWM3/7-----*///////////////////////////////////////void PWM23_Init(void){PWME_PWME3 = 0; //关闭PWM输出通道3PWMCTL_CON23=1;PWMPRCLK = 0; //选择CKLB//fre=busclkPWMSCLB = 12; //busclk/(2*pwmsclB)=1Mhz//busclk/(2*pwmsclB)=2Mhz PWMCLK_PCLK3=1;PWMPOL_PPOL3=1; //极性为高电平输出PWMCNT23 = 0;PWMDTY23 = 0; //输出占空比=[(PWMDTY23+1)/(PWMPER23+1)]*100%=10.7% PWMPER23 = 100; //outfre=24M/(2400+1)=10KHzPWME_PWME3 = 1; //PWM3输出}void PWM67_Init(void){PWME_PWME7 = 0;PWMCTL_CON67=1;PWMPRCLK = 0; //选择CKLB//fre=busclk=24MHzPWMSCLB = 12; //busclk/(2*pwmsclB)=2MhzPWMCLK_PCLK7=1;PWMPOL_PPOL7=1;PWMCNT67 = 0;PWMDTY67 = 0;PWMPER67 = 100;PWME_PWME7 = 1; //打开PWM输出通道7}/*--------------------------------------------------------////////////////PIT模数递减初始化///////////////////////---------------------------------------------------------*/void initPIT(void)//定时中断初始化函数50MS定时中断设置{PITCFLMT_PITE=0; //定时中断通道0关PITCE_PCE0=1; //定时器通道0使能PITMTLD0=240-1; //8位定时器初值设定。

相关文档
最新文档