📄 pwm.c
字号:
#include<stdio.h>
#include<io8515v.h>
#include<macros.h>
// AVR ATmega8515L
// (实验板板针注释)
// ______ ______
// | O \_/ |
// ---PB0--1 VCC 5V电源(+极)
// ---PB1--1 1--PA0---L-298
// ---PB2--1 1--PA1---L-298
// ---PB3--1 1--PA2---R-298
// 数字开关1---PB4--0 1--PA3---R-298
// 数字开关2---PB5--0 1--PA4---
// 数字开关3---PB6--0 1--PA5---
// 数字开关4---PB7--0 1--PA6---
// RESET 1--PA7---
// 收集包裹---PD0--1 ICP
// 收集包裹---PD1--1 ALE
// 电磁铁 ---PD2--1 OCIB---ENABLE L
// 舵机(收集杆)---PD3--1 0--PC7---传感器8,后计数传感器
// 收集包裹使能---PD4--1 0--PC6---传感器7,后右传感器
// ENABLE R---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,前左传感器
// |_______________|
//****************************************************************************
//语法说明
//PINx 得到端口x所有位,(对上拉的输入口,接低电平为0)
//PORTx 表示端口x,可对其赋值,从而控制输出电平(1为低电平,0为高电平)
//DDRx 对其负值表示对端口x初始化(1为输出,0为输入)
// && AND
// || OR
// ! NOT
// != Not Equal
// == Equal
//(表达式) ? x : y ; /*真返回x,假返回y*/
//****************************************************************************
//输出端口位操作(置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位的数据
//****************************************************************************
//TL TM TR前左中右传感器 TC 前计数传感器BL BM BR 后左中右传感器 BC 后计数传感器
//SJ 收集装置传感器
#define TL get_bit(PINC,0)
#define TM get_bit(PINC,1)
#define TR get_bit(PINC,2)
#define TC get_bit(PINC,3)
#define BL get_bit(PINC,4)
#define BM get_bit(PINC,5)
#define BR get_bit(PINC,6)
#define BC get_bit(PINC,7)
#define SJ get_bit(PIND,6)
//D1 D2 D3 D4三个数字开关
#define D1 get_bit(PINB,4)
#define D2 get_bit(PINB,5)
#define D3 get_bit(PINB,6)
#define D4 get_bit(PINB,7)
//白线宽度
#define WD 30
//白线污损度0~1000
#define DT 35
//端口初始化函数
void InitPorts()
{
DDRA = 0xFF;PORTA = 0xFF;//PA0~PA5控制驱动芯片
// 1111 1111 1111 1111
DDRB = 0x0F;PORTB = 0xFF;//4,5,6,7数字开关
// 0000 1111 1111 1111
DDRC = 0x00;PORTC = 0xFF;//PC口输入,接传感器
// 0000 0000 1111 1111
DDRD = 0x3F;PORTD = 0xF0;//0,1,4控制收集装置,2电磁铁,3,5舵机,6传感器
// 0011 1111 1111 0000
DDRE = 0x04;PORTE = 0x07;
}
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);//PWM1A左对齐
TCCR1A|=(1<<COM1B1)|(0<<COM1B0);//PWM1B左对齐
TCCR1B|=(1<<CS12)|(0<<CS11)|(0<<CS10);//clk/256分频
TCNT1=0;//清计数器T0
OCR1A=0;//OCR1A的初值
OCR1B=0;//OCR1B的初值
}
//右电机驱动函数
void motor_R(int speed)
{
if(speed<0)
{
set_bit(PORTD,0);
clr_bit(PORTD,1);
OCR1A=(-1)*speed*255/100*speedrp/100;
}
else if(speed==0)
{
clr_bit(PORTD,0);
clr_bit(PORTD,1);
OCR1A=speed*255/100*speedrp/100;
}
else
{
set_bit(PORTD,1);
clr_bit(PORTD,0);
OCR1A=speed*255/100*speedrp/100;
}
}
//左电机驱动函数
void motor_L(int speed)
{
if(speed<0)
{
set_bit(PORTD,2);
clr_bit(PORTD,3);
OCR1B=(-1)*speed*255/100*speedlp/100;
}
else if(speed==0)
{
clr_bit(PORTD,2);
clr_bit(PORTD,3);
OCR1B=speed*255/100*speedlp/100;
}
else
{
set_bit(PORTD,3);
clr_bit(PORTD,2);
OCR1B=speed*255/100*speedlp/100;
}
}
//行走函数
//前进
void twds(void)
{
if(s0==white&&s1==black){ motor_L(30);motor_R(70);}//左调
else if(s0==black&&s1==white){ motor_L(70);motor_R(30);}//右调
else { motor_L(70);motor_R(70);}//直行
}
//后退
void bakwds(void)
{
;
}
//停止
void stop(void)
{
motor_L(0);
motor_R(0);
}
//前进走n条白线
void towards(unsigned char n)
{
unsigned int i=0; //白线计数
unsigned int j=0; //黑线计数
unsigned char os2; //上一次线色
while(n)
{
twds();
if(os2==white && s2==white) i++;//数连续探测到白的次数
else i=0;
if(os2==black && s2==black && j<=BW) j++;//数连续探测到黑的次数
os2=s2;
if(i>=WW && j>=BW)//连续测到WW次白且之前走过BW次黑,就进行计线一次
{
n--;
i=0;
j=0;
}
PORTC=n;
delay_us(10);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -