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

📄 pwm._c

📁 avr单片机模拟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 + -