📄 motor2._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 + -