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

合集下载

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

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

[控制类] 飞思卡尔智能车舵机调试工具舵机, 调试工具, 上位机, 飞思卡尔智能车今天在调试舵机,发现经常需要频繁地修改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 自带的一个通信界面软 件——超级终端。超级终端的位置在 开始 -> 所有程序 -> 附件 -> 通讯 下,如 图。
打开超级终端后先要给此链接起名称,这个名称可以随意起。

飞思卡尔智能车程序汇总

飞思卡尔智能车程序汇总
#include "lcd5110.h"
#include "24c02.h"
#include "button.h"
#define servo_period 20 //ms
#define motor_pwm_frequ 1 //khz
void delay(unsigned int ms)
{
unsigned int i;
PWMPER23 = 80/4*servo_period*125;
PWMPER01 = 80/4*servo_period*125;
PWMDTY67 =0;
PWMDTY45 =0;
PWMDTY23 =0;
PWMDTY01 =0;
}
void main(void) {
/* put your own code here */
disply_listchar(0,3," TURN POWER OFF ",1);
disply_listchar(0,4,"=================",1);
disply_listchar(0,5," ",1);
delay(setnum[1]*100);
PORTB_PB0=0;
}
}
3.电机程序
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
unsigned char j;
for(i=0;i<ms;i++)

EN-FSROB 飞思卡尔智能车各模块调试指南

EN-FSROB 飞思卡尔智能车各模块调试指南

EN-FSROB飞思卡尔智能车各模块调试指南1、下载Motor文件夹下面的程序,测试电机驱动模块,系统控制底板:蜂鸣器、按键、OLED 接口及XS128最小系统;步骤:(1)连线:系统底板P11插针P7、P5、P3、P1/2接电机驱动模块的排针7、5、3、1/2;(2)连接电机,调节4、3按键,可发现电机转速及转向发生变化;(3)分别按下1、2按键,可关闭、打开蜂鸣器,并可观察OLED液晶显示数据是否正常;2、下载A_CarTest文件夹下面的程序,测试XS128核心板串口排针及系统控制底板舵机控制电路:步骤:(1)上电,调节电位器,万用表测试P10舵机插接排针的6V、GND引脚电压调整至6V;(2)XS128核心板UART排针通过杜邦线插上蓝牙模块,注意插线顺序;(3)手机安装蓝牙串口测试工具,并打开,通过摇动手机左右晃动可发现舵机旋转;3、CC2500模块测试:1)将T103模块插入电脑,打开《CC2500无线串口数据传输下载软件》文件夹下的下载软件;给T103模块下载程序2)给XS128下载CC2500测试程序;3)插上CC2500模块到底板,把另外一块CC2500模块通过转接座插入到T103模块,并打开串口调试助手,并按照下图进行配置:4)此时,通过串口调试助手发送数据可在底板OLED模块的R_Buff区显示出来发送的数据,然后按下地板上的四个按键中的其中一个,可在OLED模块的S_Buff区显示所按下的按键号并通过CC2500模块传送到串口调试助手;4、CCD测试;1)下载CCD测试程序;2)连接CCD传感器到智能车底板的P3或P4接口;3)电脑安装PL2303驱动,插入USB-TTL小板,并且用杜邦线将USB-TTL小板与XS128核心板连接;4)打开智能车调试助手,按如下方法配置,配置好打开串口可发现数据上传到调试助手上面;5、摄像头测试;1)下载OV7620测试程序;2)正确连接摄像头到底板上的P7OV7620转接接口;3)电脑安装PL2303驱动,插入USB-TTL小板,并且用杜邦线将USB-TTL小板与XS128核心板连接;4)打开智能车调试助手,按如下方法配置,配置好打开串口可发现摄像头所拍照片上传到调试助手上面;6、编码器测试;编码器改装,褐色——VCC;蓝色——GND;白色——IN;。

智能车制作全过程(飞思卡尔)

智能车制作全过程(飞思卡尔)

智能车制作全过程(飞思卡尔)如果我写得好,请顶我一下,我将再接再厉!(本人在很久以前做的一辆用来比赛的智能车--获得华北一等奖,全国二等奖,有许多可改进地方.)下面我们来立即开始我们的智能车之旅:首先,一个系统中,传感器至关重要."不管你的CPU的速度如何的快,通信机制如何的优越,系统的精度永远无法超越传感器的精度" .是的,在这个系统中,传感器的精度,其准确性就显得至关重要.如果你问我传感器的电路,呵呵,我早就和大家分享了,在我发表的日志中,有一篇<<基于反射式距离传感器>>的文章就详细的说明了传感器的硬件电路以及可以采取的信号采样方式.传感器安装成一排,如上面排列.(就是个一字排列,没有什么特别)接下来,看看我们如何处理传感器得到的信息:大家看到了.结构很简单,我们已经搞定了传感器通路.下面我们来看看多机的控制方面的问题:其实,不管是便宜还是比较贵的舵机,都是一样的用法.舵机的特点就是不同的占空比方波就对应着舵机的不同转角.当然不同的舵机有不同的频率要求.比如我用的这个舵机:方波频率50HZ.怎么改变占空比?这个不就是PWM模块的功能嘛.PWM模块可以输出任意占空比的方波.只要你控制其中的占空比寄存器,就可以直接控制舵机的转角.你只要将传感器的状态和这个占空比对应上,不就OK了?就这么简单,做到这里,你就可以让你的车在跑道上跑了!接下来,我们的工作是让智能车更加完善:速度要稳定.在当前的系统结构中,要使一个系统更稳定更可靠,闭环系统是一个选择.(如果你不知道什么是闭环系统,可以参照我的文章里面的一篇"基于单片机的PID电机调速"),既然是一个闭环系统,速度传感器是必不可少的,用什么样的传感器做为速度反馈呢:仔细看,和后轮之间有一条皮带的这个貌似电机的东西,就是我的速度传感器,它的学名叫"旋转编码器".这个器件的特点就是:每转一圈,就会从输出端输出一定的脉冲,比如我这个旋转编码器是500线的,就是转一圈输出500个脉冲.因此,我只要在单位时间内计数输出端输出的脉冲数,我就可以计算出车辆的速度.显然,这个速度可以用来作为PID速度调节的反馈.现在有了反馈,我们需要的是调节智能车驱动电机的速度了,如何来调速,就成了必须解决的问题了.我用的是驱动芯片MC33886. 其实,这个芯片就是一个功率放大的模块.我们知道,单片机输出的PWM信号还是TTL信号,是不能直接用来驱动电机的.非要通过功率模块的放大不可.这个道理其实很简单,就像上次我给大家画的哪个电子琴电路的放大电路一样:看上面的那个三极管,就是将TTL电路的电流放大,才能够来驱动蜂鸣器.其实这里的这个MC33886就是这样的一个作用.而且我们自己也完全可以用三极管自己搭建一个这样的功率放大电路,当然,驱动能力肯定不如这里的这个MC33886(如我们用三极管就搭建了超过MC33886的电路,摩托罗拉就不会卖几十块钱一个了.呵呵.)知道了这个MC33886的工作原理,就好说了,一句话,通过PWM来调节电机的速度.当方波中高电平占的比例大,电机的平均电压肯定高,转速肯定快.也就是说,PWM的占空比越大,电机转速越高.看,就这么简单,这个智能车就做好了.接下来,我们就把我们知道的PID知识放到舵机和直流驱动电机的控制中去.就可以达到一个比较好的控制效果.如果要达到更高的水平,肯定机械方面的改造也少不了.当然,这不属于本文的讨论范围.呵呵.智能车制作全过程(飞思卡尔---舵机篇发表于 2008/11/28 10:00:55感谢大家的支持!如果我写得好,请顶我一下!智能车的制作中,看经验来说,舵机的控制是个关键.相比驱动电机的调速,舵机的控制对于智能车的整体速度来说要重要的多.PID算法是个经典的算法,一定要将舵机的PID调好,这样来说即使不进行驱动电机的调速(匀速),也能跑出一个很好的成绩.机械方面:从我们的测试上来看,舵机的力矩比较大,完全足以驱动前轮的转向.因此舵机的相应速度就成了关键.怎么增加舵机的响应速度呢?更改舵机的电路?不行,组委会不允许.一个非常有效的办法是更改舵机连接件的长度.我们来看看示意图:从上图我们能看到,当舵机转动时,左右轮子就发生偏转.很明显,连接件长度增加,就会使舵机转动更小的转角而达到同样的效果.舵机的特点是转动一定的角度需要一定的时间.不如说(只是比喻,没有数据),舵机转动10度需要2ms,那么要使轮子转动同样的角度,增长连接件后就只需要转动5度,那么时间是1ms,就能反应更快了.据经验,这个舵机的连接件还有必要修改.大约增长0.5倍~2倍.在今年中,有人使用了两个舵机分别控制两个轮子.想法很好.但今年不允许使用了.接下来就是软件上面的问题了.这里的软件问题不单单是软件上的问题,因为我们要牵涉到传感器的布局问题.其实,没有人说自己的传感器布局是最好的,但是肯定有最适合你的算法的.比如说,常规的传感器布局是如下图:这里好像说到了传感器,我们只是略微的一提.上图只是个示意图,意思就是在中心的地方传感器比较的密集,在两边的地方传感器比较的稀疏.这样做是有好处的,大家看车辆在行驶到转弯处的情况:相信看到这里,大家应该是一目了然了,在转弯的时候,车是偏离跑道的,所以两边比较稀疏还是比较科学的,关于这个,我们将在传感器中在仔细讨论。

飞思卡尔智能车S12XS128PWM控制程序编写

飞思卡尔智能车S12XS128PWM控制程序编写

飞思卡尔智能车S12XS128PWM控制程序编写SeptStringS原创,转载请注明。

对于飞思卡尔智能车,电机和舵机的控制通常使⽤的都是以PWM脉冲宽度调制的⽅法实现的,其可⾏性基于电机可以由占空⽐控制转速,⽽舵机也由脉宽控制摆动。

PWM 调制波有 8 个输出通道,每⼀个输出通道都可以独⽴的进⾏输出。

每⼀个输出通道都有⼀个精确的计数器(计算脉冲的个数),⼀个周期控制寄存器和两个可供选择的时钟源。

每⼀个 PWM 输出通道都能调制出占空⽐从 0—100% 变化的波形。

PWM控制程序的编写⼀般按照以下的⼀种流程:1,禁⽌PWM模块;//这是由于改变周期和脉宽等操作需要在PWM禁⽌的情况下才能被设置2,PWM级联选择,是否级联通道67,45,23,01;//最多单独使⽤8个8位和级联使⽤4个16位3,给通道选择时钟源控制位;//0,1,4,5通道可选择ClockA和ClockSA;2,3,6,7通道可选择ClockB和ClockSB4,给时钟源A\B预分频;//可对总线时钟进⾏预分频,确定ClockA和ClockB,满⾜1,2,4,8,16,32,64,128这8个分频量5,根据时钟源A\B确定时钟源SA\SB;//由ClockA和ClockB、分频设值来确定ClockA和ClockB,满⾜1-255的分频量6,输出极性的选择;//也就是选择输出极性先低后⾼还是先⾼后低7,对齐⽅式的选择;//可设置为左对齐或者中间对齐⽅式8,实际通道频率的计算;//也就是周期的设定9,占空⽐寄存器的设置;//占空⽐常数的设定,可以以此决定占空⽐10,使能PWM模块。

//你已经⾸尾呼应了,有⽊有接下来通过寄存器的介绍,以上⾯流程为⼤纲,详细地说明⼀下该如何操作~~【PWME】寄存器PWME = (PWME~7 | PWME~6 | PWME~5 | PWME~4 | PWME~3 | PWME~2 | PWME~1 | PWME~0)将每⼀位设置为1即可使能该位,0对应的既是禁⽌。

飞思卡尔智能车(摄像头)核心程序

飞思卡尔智能车(摄像头)核心程序

飞思卡尔智能车(摄像头)核心程序1舵机PD法过弯策略/***************************舵机PID函数*********************************/void Angle_PID(int CENTER){//2.8float angle_kp=7.38,angle_kd=17.2;//系数PD控制if(lost_time==0 ||left_lost_time==0 ||right_lost_time==0 ) //判断如果黑线都丢失了,则不更新数据{angle_error=CENTER-CENTER_INIT;// if(left_lost_time>20 && right_lost_time==0)// angle_error=CENTER_INIT-CENTER+abs(angle_error)/8.5;// else if(left_lost_time==0 && right_lost_time>20)//angle_error=CENTER_INIT-CENTER-abs(angle_error)/8.5;angle=(int)(angle_init+angle_kp*angle_error+angle_kd*(angle_error-angle_last _error));if(angle<=angle_init-250) //防止系数过大导致舵机打死{angle=angle_init-250; //6%-9% ,,2000}if(angle>=angle_init+250){angle=angle_init+250;}angle_last_error=angle_error;PWMDTY23=angle;}}2大津法动态阈值调节/***************************大律法动态阈值*********************************/ void otsu_yuzhi( ){int wh = 128;int inIm[128];int i, t;int L = 128;double p[128];double w1=0;double u0=0;double u1 = 0;double max = 0.0;double w0 = 0;int m =0;double sigma[128];for (i = 0; i < 128; i++)inIm[i] = ADV[i]&0xff;for (i = 0; i < L; i++)p[i] = 0;//计算各灰度出现次数for (i = 0; i < 128; i++)p[inIm[i]]++;//计算各灰度级出现概率for (m = 0; m < L; m++)p[m] = p[m] / wh;for (t = 0; t < L; t++){w0 = 0;for (m = 0; m < t+1; m++)w0 += p[m];w1 = 1 - w0;u0 = 0;for (m = 0; m < t + 1; m++)u0 += m * p[m] / w0;u1 = 0;for (m = t; m < L; m++)u1 += m * p[m] / w1;sigma[t] = w0*w1*(u0-u1)*(u0-u1); }max = 0.0;for (i = 0; i < L-1; i++){if (max < sigma[i]){max = sigma[i];THRESHOLD = i;}}//二值化for (i=0; i<128; i++){ADV[i]=ADV[i]>THRESHOLD?225:0;}}3图像滤波算法/***************************3点滤波*********************************/ void lvbo3() //冒泡法排序后,改点值为中点值{uchar a[3];//定义一个数组既它的元素为7uchar i,j,k,temp;//定义3个变量for(k=3;k<125;k++){a[0]=ADV[k-1];a[1]=ADV[k];a[2]=ADV[k+1];for(i=0;i<2;i++)//进行6轮排序{for(j=0;j<2-i;j++) //每轮进行6-i次交换if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];//大的沉底,小的上浮a[j+1]=temp;}}ADV[k]=a[1];}}/***************************5点滤波*********************************/void lvbo5() //冒泡法排序后,改点值为中点值{uchar a[5];//定义一个数组既它的元素为7uchar i,j,k,temp;//定义3个变量for(k=3;k<125;k++){a[0]=ADV[k-2];a[1]=ADV[k-1];a[2]=ADV[k];a[3]=ADV[k+1];a[4]=ADV[k+2];for(i=0;i<4;i++)//进行6轮排序{for(j=0;j<4-i;j++) //每轮进行6-i次交换if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];//大的沉底,小的上浮a[j+1]=temp;}}ADV[k]=a[2];}}4边线提取for( i=Center[0]; i>6; i--) //提取左边线{if( ADV[i]>(ADV[i-5]+45) && ADV[i-1]>(ADV[i-6]+45)){left=i-5;break;}}for( i=Center[0]; i<121; i++){if( ADV[i]>(ADV[i+5]+45)&& ADV[i+1]>(ADV[i+6]+45)){right=i+5;break;}}5曲率计算void chuli(){int x1,x2,x3,y1,y2,y3;unsigned int length1,length2,length3;int S;y1=5;y2=10;y3=15;x1=Center[2];x2=Center[1];x3=Center[0];S=abs((y2-y1)*(x3-x1)-(y3-y1)*(x2-x1));length1=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));length2=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));length3=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));if(S<1)S=1;K=abs((length1*length2*length3)/S);//曲率的倒数,即曲率半径Center_Average=mid(Center[0],Center[1],Center[2]);ADV[Left[0]]=0;ADV[Right[0]]=0;Angle_PID(Center_Average);}。

改刹车如何改程序操作方法

改刹车如何改程序操作方法

改刹车如何改程序操作方法
要改变刹车程序的操作方法,需要在车辆的电子控制单元(ECU)中进行调整。

以下是一般的步骤:
1. 确定车辆的刹车系统类型:大多数现代车辆都配备了防抱死刹车系统(ABS),其控制程序不同于传统刹车系统。

因此,在进行任何操作之前,请确保了解您的车辆刹车系统的类型。

2. 连接到车辆的诊断接口:使用汽车诊断工具与车辆的ECU建立连接。

这可以通过OBD-II端口或专用的诊断端口完成。

您可能需要购买或租赁适用于您的车辆的诊断工具。

请确保按照安装说明正确地连接工具。

3. 访问刹车系统参数:通过诊断工具,访问与刹车系统相关的参数和设置。

您可以找到刹车控制程序的各个参数和选项。

记下当前的设置和值,以备将来参考。

4. 修改刹车程序:根据您想要进行的更改,调整刹车程序的相关参数和选项。

这可能包括刹车灵敏度、刹车压力、刹车分配等等。

请注意,这些参数和选项可能会根据车辆制造商和型号的不同而有所不同。

5. 测试和调整:在修改刹车程序后,进行一次测试,并根据需要进行调整。

这可以包括在不同速度下进行测试刹车距离和刹车表现,以确保您所做的更改符合您的期望。

请注意,改变刹车程序需要专业知识和技能。

如果您不确定操作的细节或后果,请咨询专业人士或经验丰富的技术人员的帮助。

误操作可能导致车辆失控或安全性问题。

飞思科尔光电组程序

飞思科尔光电组程序

我是光电组的,下面是程序,小车可以跑起来,但速度有待提升#include <hidef.h> /* common defines and macros */#include <MC9S12XS128.h> /* derivative information */#pragma LINK_INFO DERIVATIVE "mc9s12xs128"//static unsigned chardirection_turn[12]={888,1098,1208,1328,1481,1612,1730,1856,1988,2100,22 22,2368};//Chapter 12//Periodic Interrupt Timer (S12PIT24B4CV1) Page349//The PIT module has no external pins.//PIT 模式没有外部引脚//========================================================== ==============================unsigned char light=0; //激光管检测标志unsigned short turn_value=0; //转向的PWM数值unsigned short direction_turn[7]={333,430,560,647,705,780,888}; //转向给定值初始化short speed_set[7]={250,300,350,400,350,300,250}; //速度给定值short speed_flag=0; //速度档位标志位short speed[3]={0,0,0}; //速度检测函数short pulse_count=0; //编码器脉冲计数值short speed_expect=0; //理想速度short kp=2; //比例环节short ki=0; //积分环节short kd=1; //微分环节short ek1=0; //误差1short ek2=0; //误差2short ek3=0; //误差3short speed_add=0; //速度增量//========================================================== =============================void PLL_Init() //时钟初始化{REFDV=0x81; /*PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)*/SYNR=2; /* 锁相环时钟=2*16*(2+1)/(1+1)=48MHZ */while(!(CRGFLG&0x08)); /* 总线时钟=48/2=24MHZ */CLKSEL=0x80;}void PWM_Init() //PWM初始化{PWME=0x00; //关闭PWM使能PWMPRCLK=0x66; //A,B时钟均为总线的64分频,375KHZ//PWMSCLA=0x01; //clockSA=clockA/(2*PWMSCLA) = 1500KHZ //PWMSCLB=0X01; //clockSB=clockB/(2*PWMSCLB) =1500KHZ PWMCLK=0x00;PWMPOL=0xFF; //PWM输出起始电平为高电平PWMCAE=0x00; //输出左对齐PWMCTL=0xf0; //通道01,23,45,67级联PWMPER01=5999; //舵机频率为62.5HzPWMDTY01=647; //占空比a=(PWMDTY01+1)/(PWMPER01+1) PWMPER23=1000; //PWM通道3周期为375HZPWMDTY23=0; //占空比a=(PWMDTY01+1)/(PWMPER01+1)占空比50% ~~ 150PWMPER45=1000; //PWM通道5周期为0.10ms 10KZH300=0.00010/(1/3000000)PWMDTY45=300; //占空比a=(PWMDTY01+1)/(PWMPER01+1)PWMPER67=375; //频率为1000HzPWMDTY67=200; //PWME=0xff; //使能pwm}void Pit0_Init() //PIT初始化{PITCFLMT_PITE=0; //关PIT使能PITCE_PCE0=1; //通道0使能PITMUX_PMUX0=0; //通道0接微时钟0PITMTLD0=99; //微时钟0值设置为7fPITLD0=3839; //time-out period = (PITMTLD + 1) * (PITLD + 1) / fBUS.//时间计算100*3840/24000000=0.016s PITINTE_PINTE0=1; //通道0中断时能PITCFLMT_PITE=1; //PIT使能}void ECT_Init(){TIOS=0x00; /* OC0路为输出比较,OC1路为输入捕捉*/TSCR2=0x06; /* 定时器溢出中断禁止,计数器自由运行禁止复位,64分频*/TSCR1=0x80; /* 定时器使能*/TIE=0x01; /* 输出比较相应中断使能*/TCTL4=0x01;}void dly_1ms(){int i,j;for(i=0;i<200;i++){for(j=0;j<1000;j++){;}}}void sam_position() //车位检测函数{int i=0,j=0;unsigned char m=0,n=0;n=PORTA;for(i;i<10;i++){m=PORTA;if(n==m)j++;}if(j>6)light=n;}void check_start() //检测起始线{if((light&&4)||(light&&16))start_flag++;}void check_start(){}void turning() //舵机转向函数{switch(light){case 1:if(turn_value==direction_turn[1]) //出界判断算法{turn_value=direction_turn[0];speed_expect=speed_set[0];}else if(turn_value==direction_turn[0]){turn_value=direction_turn[0];speed_expect=speed_set[0];}break;case 2:if(turn_value==direction_turn[0]){turn_value=direction_turn[1];speed_expect=speed_set[1];}else if(turn_value==direction_turn[1]){turn_value=direction_turn[1];speed_expect=speed_set[1];}else if(turn_value==direction_turn[2]){turn_value=direction_turn[1];speed_expect=speed_set[1];}break;case 4:if(turn_value==direction_turn[1]){turn_value=direction_turn[2];speed_expect=speed_set[2];}else if(turn_value==direction_turn[2]){turn_value=direction_turn[2];speed_expect=speed_set[2];}else if(turn_value==direction_turn[3]){turn_value=direction_turn[2];speed_expect=speed_set[2];}break;case 8:if(turn_value==direction_turn[2]){turn_value=direction_turn[3];speed_expect=speed_set[3];}else if(turn_value==direction_turn[3]){turn_value=direction_turn[3];speed_expect=speed_set[3];}else if(turn_value==direction_turn[4]){turn_value=direction_turn[3];speed_expect=speed_set[3];}break;case 16:if(turn_value==direction_turn[3]){turn_value=direction_turn[4];speed_expect=speed_set[4];}else if(turn_value==direction_turn[4]){turn_value=direction_turn[4];speed_expect=speed_set[4];}else if(turn_value==direction_turn[5]){turn_value=direction_turn[4];speed_expect=speed_set[4];}break;case 32:if(turn_value==direction_turn[4]){turn_value=direction_turn[5];speed_expect=speed_set[5];}else if(turn_value==direction_turn[5]){turn_value=direction_turn[5];speed_expect=speed_set[5];}else if(turn_value==direction_turn[6]){turn_value=direction_turn[5];speed_expect=speed_set[5];}break;case 64:if(turn_value==direction_turn[5]) //出界判断算法{turn_value=direction_turn[6];speed_expect=speed_set[6];}else if(turn_value==direction_turn[6]){turn_value=direction_turn[6];speed_expect=speed_set[6];}break;default:break;}PWMDTY01=turn_value;}void check_speed() //速度检测函数{ek3=ek2; //计算速度差值ek2=ek1;ek1=speed_expect-pulse_count;speed[2]=speed[1]; //当前速度放在[0],之前放在[1],[2]speed[1]=speed[0];speed[0]=pulse_count;pulse_count=0;}void speed_down() //制动函数{PWMDTY23=300; //电机反向供电PWMDTY45=0;}void speed_pid() //PID算法{speed_add=kp*(ek1-ek2)+ki*ek1+kd*(ek1-2*ek2+ek3); //PID增量式}void driver() //驱动电机控制函数{//if(((turn_value>705)||(turn_value<560))&&(speed[0]>200)) //当前速度若远超给定速度// {//speed_down();// }//else// {PWMDTY23=0;speed_pid();PWMDTY45=PWMDTY45+speed_add;// }if(PWMDTY45>600)PWMDTY45=600;}void main(){DisableInterrupts; /* 关中断*/PLL_Init();PWM_Init();Pit0_Init();ECT_Init();turn_value=direction_turn[3];DDRA=0x00;DDRB=0xFF;PORTB=0X00;EnableInterrupts;for(;;){//sam_position();//turning();}}#pragma CODE_SEG NON_BANKEDvoid interrupt 8 Timer0_ISR(void){pulse_count++;TFLG1_C0F=1; /* TC0端有中断产生*/ }void interrupt 66 PIT0_ISR(void){sam_position(); //车位检测函数turning(); //舵机转向函数check_speed(); //速度检测函数driver(); // 驱动电机控制函数PITTF_PTF0=1; /* PIT0端有中断产生,清除标志位*/ }。

C语言实现控制电机加减速正反转(飞思卡尔C代码)

C语言实现控制电机加减速正反转(飞思卡尔C代码)

用单片机控制直流电动机的正反转、加减速的程序如何用C语言写参考一下这个例子吧。

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit PW1=P2^0 ;sbit PW2=P2^1 ; //控制电机的两个输入sbit accelerate=P2^2 ; //调速按键sbit stop=P2^3 ; //停止按键sbit left=P2^4 ; //左转按键sbit right=P2^5 ; //右转按键#define right_turn PW1=0;PW2=1 //顺时针转动#define left_turn PW1=1;PW2=0 //逆向转动#define end_turn PW1=1;PW2=1 //停转uint t0=25000,t1=25000; //初始时占空比为50%uint a=25000; // 设置定时器装载初值 25ms 设定频率为20Hz uchar flag=1; //此标志用于选择不同的装载初值uchar dflag; //左右转标志uchar count; //用来标志速度档位void keyscan(); //键盘扫描void delay(uchar z);void time_init(); //定时器的初始化void adjust_speed(); //通过调整占空比来调整速度//**********************************//void main(){time_init(); //定时器的初始化while(1){keyscan(); //不断扫描键盘程序,以便及时作出相应的响应}}//*************************************//void timer0() interrupt 1 using 0{if(flag){flag=0;end_turn;a=t0; //t0的大小决定着低电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}else{flag=1; //这个标志起到交替输出高低电平的作用if(dflag==0){right_turn; //右转}else{left_turn; //左转}a=t1; //t1的大小决定着高电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}}void time_init(){TMOD=0x01; //工作方式寄存器软件起动定时器定时器功能方式1 定时器0TH0=(65536-a)/256;TL0=(65536-a)%256; //装载初值ET0=1; //开启定时器中断使能EA=1; // 开启总中断TR0=0;}//****************************************//void delay(uchar z) //在12M下延时z毫秒{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//******************************//void keyscan(){if(stop==0){TR0=0; //关闭定时器0 即可停止转动 end_turn;}if(left==0){TR0=1;dflag=1; //转向标志置位则左转}if(right==0){TR0=1;dflag=0; //转向标志复位则右转}if(accelerate==0){delay(5) ; //延时消抖if(accelerate==0){while(accelerate==0) ; //等待松手count++;if(count==1){t0=20000;t1=30000; //占空比为百分之60}if(count==2){t0=15000;t1=35000; //占空比为百分之70}if(count==3){t0=10000;t1=40000; //占空比为百分之80}if(count==4){t0=5000;t1=45000; //占空比为百分之90}if(count==5){count=0;}}}}功能特点:1)总线速度高达40 M Hz,CAN总线:3个1Mbps的CAN总线,兼容CAN2.0 A/B;2)128 KB程序Flash和8 KB DataFlash,用于实现程序和数据存储,均带有错误校正码(E CC);3)可配置A/D:16通道模数转换器;可选8位10位和12位精度,3μs的转换时间4)内嵌MS CAN模块用于CAN节点应用,内嵌支持LIN协议的增强型SIC模块和SPI模块;5)4通道16位计数器,CRG时钟和复位发生器:锁相环、看门狗、实时中断;增强型捕捉定时器;6)出色的低功耗特性,带有中断唤醒功能的10,实现唤醒休眠系统的功能;7)通道PWM:8位8通道或16位4通道PWM,易于实现电机控制。

飞思卡尔单片机mc9s12dg128的pwm参考程序

飞思卡尔单片机mc9s12dg128的pwm参考程序

飞思卡尔单片机m c9s12d g128的p w m参考程序(总3页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--飞思卡尔单片机mc9s12dg128的pwm参考程序大学生参考网发表时间:10月13日 17:44 提交:demon#include <> /* common defines and macros */#include <> /* derivative information*/#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"/***********************************************************pwm初始化函数北华大学王盼宝 by demon 2007-5-12*********************************************************/voidpwm_initial()//pwm初始化函数{ PWME=0x22;//通道01,45使能 PWMPOL=0x22;//通道01,45输出波形开始极性为1 PWMCTL=0x50;//通道01,45级联 PWMCLK=0x02;//通道01选择SA为时钟源 PWMSCLA=0X04;//通道01时钟SA为3MHz(24/(2*4))PWMPER01=60000;//设定通道01输出频率(50Hz)PWMPER45=12000;//设定通道45输出频率(2KHz)}/***********************************************************pwm输出函数 by demon 2007-5-12*程序描述;由输入参数向舵机和电机输出相应pwm*参数:舵机方向:3300-5700 速度:0-12000*********************************************************/void pwm(int speed,int direction)//pwm{pwm_initial();if(direction<3300)direction=3300; if(direction>5700) direction=5700; PWMDTY01=direction;if(speed>12000) speed=12000;PWMDTY45=speed; }飞思卡尔单片机mc9s12dg128的io口初始化参考程序大学生参考网发表时间:10月13日 17:47 提交:demon#include <> /* common defines and macros */#include <> /* derivative information*/#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"北华大学王盼宝void main(){ DDRA=0x00; DDRB=0xFF;PUCR=0x02; while(1){ PORTB=PORTA; } EnableInterrupts;for(;;) {} /* wait forever *//* please make sure that you never leave this function */}飞思卡尔单片机mc9s12dg128的ad初始化参考程序void AD(void) { word t0=0;word t1=0;word t2=0;word t3=0;word t4=0;word t5=0;word t6=0;word t7=0;while(ATD0STAT0_SCF) { t0=ATD0DR0; ad00= (byte)(t0>>8);//高8位移到低8位且高8位为0 t1=ATD0DR1; ad01=(byte)(t1>>8); t2=ATD0DR2; ad02=(byte)(t2>>8); t3=ATD0DR3; ad03=(byte)(t3>>8); t4=ATD0DR4; ad04=(byte)(t4>>8); t5=ATD0DR5; ad05=(byte)(t5>>8); t6=ATD0DR6; ad06=(byte)(t6>>8); t7=ATD0DR7; ad07= (byte)(t7>>8); }。

飞思卡尔DG128_PE编程入门教程

飞思卡尔DG128_PE编程入门教程

飞思卡尔DG128—PE编程入门教程(1)首先打开CodeWarrior 5.0 开发环境,然后在弹出的选项中选择新建工程注释:如果没有弹出这个对话框,可以在下面的File中选择New Project新建一个工程。

(2) 选择开发芯片的型号(这里我们使用的是MC9S12DG128)接着选择TBDML,这个是我们使用在线调试功能的选项。

(3) 选择工程的生成路径,注意:如果我们不使用PE编程功能的话,在这步结束后,可以直接选择完成按钮来完成工程的新建。

(4) (PE编程功能的步骤)下一步,这个对话框我们什么都不用选择,直接点击下一步。

(5)选择下面这个选项来启动PE编程功能。

(6) 红色边框中选项的功能为是否启动浮点数据的使用,默认第一个是不启用;第二个是启用,float数据为32位,double为32位;第三个是启用,float 数据为32位,double数据为64位。

(7)最后一步什么都不要设置,直接点击完成。

(8) 以上步骤我们完成了一个DG128工程的新建步骤。

PE的使用步骤:(1) 新建工程后,会自动弹出个芯片封装型号的选择,选择后点击OK。

(注意:我们学校使用的芯片是112管脚,所以注意选择红线标注的选项)(2) 点击OK后,就会出现我们要编程的环境了。

如下所示:(3)红色标注的地方就是该工程的工作区。

细心的同学就会发现,它生成的文件中没有我们需要写的源文件XXX.c 。

那我们现在就来生成这些文件,找到下图的选项Processor Expert 。

然后点击第二个选项的Generate Code ' XXX .mcp' (这里的XXX 表示该工程名称)。

下面是自动生成的文件。

这时候发现软件为我们自动的生成了一个Project.c (Project 是我这个工程建立的文件命,不同的工程文件名将导致这个名字不同)的文件。

这个就是我们将要编写的源文件了,它里面包含了主函数main()。

相关主题
  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位定时器初值设定。

相关文档
最新文档