⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor2._c

📁 电机驱动
💻 _C
字号:
#include<stdio.h>
#include<iom8515v.h>
#include<macros.h>
//                       AVR  ATmega8515L
//                      (实验板板针注释)
//                       ______   ______
//                      | O    \_/      |
//      数字开关1---PB0--0                VCC   5V电源(+极)
//      数字开关2---PB1--0             1--PA0---L-298
//      数字开关3---PB2--0             1--PA1---L-298
//      数字开关4---PB3--0             1--PA2---R-298
//               ---PB4--1             1--PA3---R-298
//               ---PB5--1             1--PA4---舵机(收集杆)
//               ---PB6--1             1--PA5---舵机(提升装置)
//               ---PB7--1             1--PA6---
//                  RESET              1--PA7---
//       收集包裹---PD0--1                ICP
//       收集包裹---PD1--1                ALE
//        电磁铁 ---PD2--1             1--OCIB---ENABLE L(PWM)
// 收集包裹使能  ---PD3--1             0--PC7---传感器8,后计数传感器
//收集装置传感器 ---PD4--0             0--PC6---传感器7,后右传感器
//  ENABLE R(PWM)---PD5--1             0--PC5---传感器6,后中传感器
//               ---PD6--0             0--PC4---传感器5  后左传感器
//               ---PD7--0             0--PC3---传感器4,前计数传感器
//                  xtal2              0--PC2---传感器3,前右传感器
//                  xtal1              0--PC1---传感器2,前中传感器
//      (-极)地线   GND                0--PC0---传感器1,前左传感器
//                      |_______________|
//****************************************************************************
//输出端口位操作(置1为高电平,清0为低电平)
#define set_bit(x,y)	(x|=(1<<y)) 
//将x端口的第y位设置成1
#define clr_bit(x,y)	(x&=~(1<<y))
//将x端口的第y位设置成0
//****************************************************************************
//输入端口位操作(1为闭合,0为断开)
#define get_bit(x,y)	((x&(1<<y)) ? 1 : 0)
//得到x端口第y位的数据

#define speedrp 100
//motor_R减慢成原来的speedrp%
#define speedlp 100
//motor_L减慢成原来的speedlp%
//****************************************************************************
//TL TM TR前左中右传感器 TC 前计数传感器BL BM BR 后左中右传感器 BC 后计数传感器
//SJ 收集装置传感器  
#define TL get_bit(PINC,4)
#define TM get_bit(PINC,3)
#define TR get_bit(PINC,2)
#define TC get_bit(PINC,0)
#define BL get_bit(PINC,5)
#define BM get_bit(PINC,6)
#define BR get_bit(PINC,7)
#define BC get_bit(PINC,1)
#define SJ get_bit(PIND,4)
//D1 D2 D3 D4三个数字开关
#define D1 get_bit(PINB,0)
#define D2 get_bit(PINB,1)
#define D3 get_bit(PINB,2)
#define D4 get_bit(PINB,3)
//白线宽度
#define WD 30
//白线污损度0~1000
#define DT 35
//端口初始化函数
void InitPorts()
{
 DDRA  = 0xFF;PORTA = 0x0F;//PA0~PA5控制驱动芯片
 //  1111 1111    0000 1111
 DDRB  = 0xFF;PORTB = 0xFF;//0,1,2,3数字开关
//  1111 0000    1111 1111
 DDRC  = 0x00;PORTC = 0xFF;//PC口输入,接传感器
//  0000 0000    1111 1111
 DDRD  = 0x2F;PORTD = 0x38;//
//  0010 1111    0011 1000
 DDRE  = 0x04;PORTE = 0x04;//2口PWM输出
}
//****************************************************************************
//微秒级延时程序
void delay_us(unsigned int time){do {  time--; } while (time>1);}
//毫秒级延时程序
void delay_ms(unsigned int time){while(time!=0) { delay_us(1000); time--;}}
//秒级延时程序
void delay_s(unsigned int time){while(time!=0) { delay_ms(1000); time--;}}
//****************************************************************************
//PWM初始化
void pwm_init(void)
{
  TCCR1A=0x00;
  TCCR1B=0x00;
  TCCR1B|=(0<<WGM13)|(1<<WGM12);
  TCCR1A|=(0<<WGM11)|(1<<WGM10);//选择成8位快速PWM模式
  TCCR1A|=(1<<COM1A1)|(0<<COM1A0);//比较比配清零
  TCCR1A|=(0<<COM1B1)|(0<<COM1B0);
  TCCR1B|=(1<<CS12)|(0<<CS11)|(0<<CS10);//clk/256分频
  TCNT1=0;//清计数器T0
  OCR1A=0;//OCR1A的初值
}
void pwm0_init(void)
{
//控制寄存器设置
  TCCR0=0x00;
  TCCR0|=(1<<WGM00)|(1<<WGM01);//选择成快速PWM模式
  TCCR0|=(1<<COM01)|(0<<COM00);//PWM左对齐
  TCCR0|=(1<<CS02)|(0<<CS01)|(0<<CS00);//clk/256分频
//计数器T0一次性初值
  TCNT0=0;//清计数器T0
  OCR0=0;//比较匹配赋初值,让高电平时间大约为1.5ms,舵机理论居中
//TIMSK不需要设置
//
}
//驱动电机控制函数
//右电机驱动函数
void motor_R(int speed)
{
  if(speed<0)
  {
    set_bit(PORTA,3);
	clr_bit(PORTA,2);
	OCR1A=(-1)*speed*255/100*speedrp/100;
  }
  else if(speed==0)
  {
	clr_bit(PORTA,2);
	clr_bit(PORTA,3);
    OCR1A=speed*255/100*speedrp/100;
  }
  else
  {
    set_bit(PORTA,2);
	clr_bit(PORTA,3);
	OCR1A=speed*255/100*speedrp/100;
  }
}
//左电机驱动函数
void motor_L(int speed)
{
  if(speed<0)
  {
    set_bit(PORTA,1);
	clr_bit(PORTA,0);
	OCR0=(-1)*speed*255/100*speedlp/100;
  }
  else if(speed==0)
  {
	clr_bit(PORTA,0);
	clr_bit(PORTA,1);
    OCR0=speed*255/100*speedlp/100;
  }
  else
  {
    set_bit(PORTA,0);
	clr_bit(PORTA,1);
	OCR0=speed*255/100*speedlp/100;
  }
}
void forward()    {motor_L(90);motor_R(90);} //0011 1010 车头向前
void backward()   {motor_L(-90);motor_R(-90);} //0011 0101 车尾向前
void stop()      {motor_L(0);motor_R(0);} //0000 0000 停止
void pause()      {set_bit(PORTA,0);set_bit(PORTA,1);
                   set_bit(PORTA,2);set_bit(PORTA,3);} //0011 1111 制动
void forleft()   {motor_L(1);motor_R(70);} //0011 1000 车头向前左拐
void foright()   {motor_L(70);motor_R(1);} //0011 0010 车头向前右拐
void backleft()  {motor_L(-70);motor_R(-1);} //0011 0001 车尾向前左拐
void backright() {motor_L(-1);motor_R(-70);} //0011 0100 车尾向前右拐
void cycleft()   {motor_L(-40);motor_R(50);} //0011 1001 逆时针旋转
void cycright()  {motor_L(50);motor_R(-40);} //0011 0110 顺时针旋转

//收集包裹函数
void getpacket()
{set_bit(PORTD,0); 
 clr_bit(PORTD,1);}//10,启动收集装置
void stopget()   
{
 while(SJ==1) getpacket(); 
 set_bit(PORTD,1);
 clr_bit(PORTD,0);
 delay_ms(50);
 set_bit(PORTD,1);
 set_bit(PORTD,0);
 }
 
void main()
{ 
   CLI();
  pwm0_init();
  InitPorts();
  pwm_init();
  SEI();
  delay_ms(200);
  
  /*forward();//同时正转
  delay_s(3);
  pause();
  delay_s(3);
  backward();//同时反转
  delay_s(3);
  pause();
  delay_s(3);
  forleft();//左停右正
  delay_s(3);
  pause();
  delay_s(3);
  foright();//左正右停
  delay_s(3);
  pause();
  delay_s(3);
  backleft();//左反右停
  delay_s(3);
  pause();
  delay_s(3);
  backright();//左停右反
  delay_s(3);
  pause();
  delay_s(3);*/
  cycleft();//左反右正
  delay_s(3);
  pause();
  delay_s(3);
  cycright();//左正右反
  delay_s(3);
  /*getpacket();
  delay_s(3);
  stopget();*/
  }
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -