📄 pwm._c
字号:
#include<stdio.h>
#include<io8515v.h>
#include<macros.h>
#define speedrp 100
//motor_R减慢成原来的speedrp%
#define speedlp 100
//motor_L减慢成原来的speedlp%
#define set_bit(port,bit) (port|=(1<<bit))
#define clr_bit(port,bit) (port&=~(1<<bit))
#define get_bit(pin,bit) ((pin&(1<<bit)) ? 1 : 0)
void ports_init(void)
{
DDRA=0x00; PORTA=0xFF; //PA 0~7 使用ADC0~7检测传感器的值(逆时针调整变远)
DDRB=0b00001011; PORTB=0b11111111;
//PB 0~1 控制旋转棒,2 左碰撞开关,
//PB 3 使用OC0输出PWM控制右电机,
//PB 4~7 拨码开关
DDRC=0xFF; PORTC=0xFF; //PC 0~7 8LED指示灯
DDRD=0b10111111; PORTD=0b11001111;
//PD 0~1 控制右电机,2~3 控制左电机,
//PD 4 OC1B 左舵机控制,5 OC1A 右舵机控制,
//PD 6 右碰撞开关,7 使用OC2输出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);//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 + -