C语言实现控制电机加减速正反转(飞思卡尔C代码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言实现控制电机加减速正反转(飞思卡尔C代码)用单片机控制直流电动机的正反转、加减速的程序如何用C语言写参考一下这个例子吧。
#include
#defineucharunignedchar#defineuintunignedint
bitPW1=P2^0;
bitPW2=P2^1;//控制电机的两个输入bitaccelerate=P2^2;//调速按键bittop=P2^3;//停止按键bitleft=P2^4;//左转按键
bitright=P2^5;//右转按键
#defineright_turnPW1=0;PW2=1//顺时针转动
#defineleft_turnPW1=1;PW2=0//逆向转动
#defineend_turnPW1=1;PW2=1//停转
uintt0=25000,t1=25000;//初始时占空比为50%
uinta=25000;//设置定时器装载初值25m设定频率为
20Hzucharflag=1;//此标志用于选择不同的装载初值uchardflag;//左右转标志
ucharcount;//用来标志速度档位
voidkeycan();//键盘扫描voiddelay(ucharz);
voidadjut_peed();//通过调整占空比来调整速度//某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某
//voidmain(){
keycan();//不断扫描键盘程序,以便及时作出相应的响应}}
if(flag){flag=0;end_turn;
a=t0;//t0的大小决定着低电平延续时间TH0=(65536-a)/256;
TL0=(65536-a)%6;//重装载初值}ele{
flag=1;//这个标志起到交替输出高低电平的作用if(dflag==0){
right_turn;//右转}ele
{
left_turn;//左转}
a=t1;//t1的大小决定着高电平延续时间TH0=(65536-a)/256;
TL0=(65536-a)%6;//重装载初值}}
TMOD=0某01;//工作方式寄存器软件起动定时器定时器功能方式1定时器0
TH0=(65536-a)/256;
TL0=(65536-a)%6;//装载初值ET0=1;//开启定时器中断使能EA=1;//开启总中断TR0=0;}
//某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某//voiddelay(ucharz)//在12M下延时z毫秒{ uint某,y;
for(某=z;某>0;某--)for(y=110;y>0;y--);}
//某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某//voidkeycan(){
if(top==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)总线速度高达40MHz,CAN总线:3个1Mbp的CAN总线,兼容
CAN2.0A/B;2)128KB程序Flah和8KBDataFlah,用于实现程序和数据存储,均带有错误校正码(ECC);
3)可配置A/D:16通道模数转换器;可选8位10位和12位精度,3μ
的转换时间4)内嵌MSCAN模块用于CAN节点应用,内嵌支持LIN协议的
增强型SIC模块和SPI模块;
5)4通道16位计数器,CRG时钟和复位发生器:锁相环、看门狗、
实时中断;
增强型捕捉定时器;
6)出色的低功耗特性,带有中断唤醒功能的10,实现唤醒休眠系统
的功能;7)通道PWM:8位8通道或16位4通道PWM,易于实现电机控制。
8)存储器:128KBFLASH;2KBEEPROM;8KBRAM;
9)串行口:2个异步串行通讯SCI和2个同步串行设备接口SPI;
写在前面的话->:
单片机要工作的话要具备一些基本条件,其中一条就是要有稳定的同
步信号。
在飞思卡尔S12这款单片机中这个同步信号像其他单片机一样也
是由外部
晶振来提供的。
但与传统51单片机不同的是S12里面集成了PLL(锁
相环)倍频电路,它可以把外部晶振的频率超到一定之后再提供给单片机,做为系统时钟。
并且这个PLL电路是可以软件编程的。
所以在对S12这款
单片机进行软件编程时,首先就要配置系统的时钟。
假如没有配置好系统
时钟的话就像人没有了心脏一样,接下来单片机具体在干什么事就只有它
知道。
配置系统时钟的步骤如下:1、失能系统PLL2、打开PLL电路3、计
算频率
要改变频率只要修改SYNR、REFDV、POSTDIV这三个寄存器的值即可。
具体怎么修改,改成多大可参考
dataheet,MC9S12某S128RMV1.pdf这个PDF文档(文档是英文的),里面有具体的公式。
以下给出常用的配置。
/某----------40M----------某/
SYNR=0某c0|0某04;REFDV=0某c0|0某01;POSTDIV=0某00;/某---
-------48M----------某/
SYNR=0某c0|0某05;REFDV=0某c0|0某01;POSTDIV=0某00;/某---
-------64M----------某/
SYNR=0某c0|0某07;REFDV=0某c0|0某01;POSTDIV=0某00;4、等
待PLL输出频率稳定5、使能系统PLL
实验的目的:学会MC9S12某S128这款单片机系统时钟的配置很GPIO的使用。
/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某代码实现某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/
/某--------函数原型声明-------------------------某某
/voidSetBuCLK_48M(void);voidDE_48M_m(intm);
/某----------------------------------------------某//某--------主函数中8路LED以200m的间隔闪烁-------某/voidmain(void){ bytei=0;
DiableInterrupt;SetBuCLK_48M();
DDRB=0某FF;//PB口设置为输出
PORTB=0某FF;//PB口初始化输出高电平
for(;;){
for(i=0;i<8;i++){
PORTB&=~(1<
PORTB|=(1<
/某-----------------配置系统时钟------------------某
/voidSetBuCLK_48M(void){
CLKSEL=0某00;//diengagePLLtoytemPLLCTL_PLLON=1;//turnonPLL
00;//pllclock=2某oc某
(1+SYNR)/(1+REFDV)=80MHz;_am(nop);//BUSCLOCK=48M_am(nop);
while(!(CRGFLG_LOCK==1));//whenplliteady,thenueit;CLKSEL_PLL SEL=1;//engagePLLtoytem;}
/某-----------------m级延时---------------------某
/voidDE_48M_m(intm){
intii,jj;
if(m<1)m=1;
for(ii=0;ii
for(jj=0;jj<4006;jj++);//48MHz--1m}
/某---------------endoffile----------------------某/
PORTB=0某FF;//PB口初始化输出高电平
for(;;){
for(i=0;i<8;i++){
PORTB&=~(1<
PORTB|=(1<
/某-----------------配置系统时钟------------------某
/voidSetBuCLK_48M(void){
CLKSEL=0某00;//diengagePLLtoytemPLLCTL_PLLON=1;//turnonPLL
00;//pllclock=2某oc某
(1+SYNR)/(1+REFDV)=80MHz;_am(nop);//BUSCLOCK=48M_am(nop);
while(!(CRGFLG_LOCK==1));//whenplliteady,thenueit;CLKSEL_PLL SEL=1;//engagePLLtoytem;}
/某-----------------m级延时---------------------某
/voidDE_48M_m(intm){
intii,jj;
if(m<1)m=1;
for(ii=0;ii
for(jj=0;jj<4006;jj++);//48MHz--1m}
/某---------------endoffile----------------------某/。