新人求助。。。——
时间:10-02
整理:3721RD
点击:
刚学AVR 想做一个循迹小车的程序 用相位修正PWM来控制小车 PD4 PD5输出PWM波可是为什么用示波器没法测出来波形。? 小白不懂求指导
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
/***************短延时*********12MHZ xus*/
void delay_short(uint x)
{
uchar i,j,k;
for(k=0;k<x;k++)
{
for(i=1;i>0;i--)
{
for(j=3;j>0;j--);
}
}
}
/*************长延时**********12MHZ xms*/
void delay_long(uint x)
{
uint i,j,k;
for(k=0;k<x;k++)
{
for(i=129;i>0;i--)
{
for(j=45;j>0;j--);
}
}
}
/************IO初始化********/
void IOinit(void)
{
DDRA = DDRA&0xF0; //PA口输入
PORTA = 0xF0;
DDRB=0xFF; //PB口输出
PORTB=0XFF;
DDRD=0xFF; //PD 输出
PORTD|=0x18;
}
/************T1初始化*******/
void T1init(void)
{
uint i,j;
i=300;
j=300;
CLI(); //禁止所有中断
MCUCR = 0x00;
GICR = 0x00;
TIMSK |= 0x18; //输出比较使能
TCCR1A = 0x50;//相位与频率修正PWM,TOP值为ICR1,向上计数匹配清零,向下计数匹配时置1
TCCR1B = 0x11;//1分频,A,B同时输出PWM
ICR1=1000;
OCR1A=i;
OCR1B=j;
SEI();//开全局中断
}
***********占空比调整**********/
void Revise(uint left,uint right)
{
OCR1A=right*10;
OCR1B=left*10;
}
/*********巡线处理*********/
void Search(void)
{
if(PINA=0x01) //左侧检测到黑线
{
delay_long(50);
Revise(15,85);
}
if(PINA=0x08) //右侧检测到黑线
{
delay_long(50);
Revise(85,15);
}
if(PINA=0x0F) //全部检测到
{
Revise(40,40);
}
if(PINA=0x06) //中间两个灯
{
Revise(40,40);
}
if(PINA=0x00) //均没有检测到
{
Revise(40,40);
}
if(PINA=0x04) //中间左灯
{
delay_long(30);
Revise(40,60);
}
if(PINA=0x02) //中间右灯
{
delay_long(30);
Revise(60,40);
}
}
void main(void)
{
delay_long(50);
IOinit();
T1init();
while(1)
{
Search();
}
}
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
/***************短延时*********12MHZ xus*/
void delay_short(uint x)
{
uchar i,j,k;
for(k=0;k<x;k++)
{
for(i=1;i>0;i--)
{
for(j=3;j>0;j--);
}
}
}
/*************长延时**********12MHZ xms*/
void delay_long(uint x)
{
uint i,j,k;
for(k=0;k<x;k++)
{
for(i=129;i>0;i--)
{
for(j=45;j>0;j--);
}
}
}
/************IO初始化********/
void IOinit(void)
{
DDRA = DDRA&0xF0; //PA口输入
PORTA = 0xF0;
DDRB=0xFF; //PB口输出
PORTB=0XFF;
DDRD=0xFF; //PD 输出
PORTD|=0x18;
}
/************T1初始化*******/
void T1init(void)
{
uint i,j;
i=300;
j=300;
CLI(); //禁止所有中断
MCUCR = 0x00;
GICR = 0x00;
TIMSK |= 0x18; //输出比较使能
TCCR1A = 0x50;//相位与频率修正PWM,TOP值为ICR1,向上计数匹配清零,向下计数匹配时置1
TCCR1B = 0x11;//1分频,A,B同时输出PWM
ICR1=1000;
OCR1A=i;
OCR1B=j;
SEI();//开全局中断
}
***********占空比调整**********/
void Revise(uint left,uint right)
{
OCR1A=right*10;
OCR1B=left*10;
}
/*********巡线处理*********/
void Search(void)
{
if(PINA=0x01) //左侧检测到黑线
{
delay_long(50);
Revise(15,85);
}
if(PINA=0x08) //右侧检测到黑线
{
delay_long(50);
Revise(85,15);
}
if(PINA=0x0F) //全部检测到
{
Revise(40,40);
}
if(PINA=0x06) //中间两个灯
{
Revise(40,40);
}
if(PINA=0x00) //均没有检测到
{
Revise(40,40);
}
if(PINA=0x04) //中间左灯
{
delay_long(30);
Revise(40,60);
}
if(PINA=0x02) //中间右灯
{
delay_long(30);
Revise(60,40);
}
}
void main(void)
{
delay_long(50);
IOinit();
T1init();
while(1)
{
Search();
}
}
没用过这款单片机