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

📄 pwm.c

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