各位高手我的程序为什么下载到小车上没有反应呢?/传感器是好的??
#include "SPCE061V004.h"
void Delay();
void GoAhead();
void TurnLeft();
void TurnRight();
void StopCar();
extern unsigned int Get_IOB_Data(void);
main()
{
unsigned int uiIOB;
int iMoveFlag = 0x0000;
*P_Watchdog_Clear = 0x0001;
*P_IOA_Dir = 0xffff;
*P_IOA_Attrib = 0xffff;
*P_IOA_Data = 0x0000;
*P_IOB_Dir = 0xfc00;
*P_IOB_Attrib = 0xfc00;
*P_IOB_Data = 0x0000;
while (1)
{
*P_IOB_Data = iMoveFlag;
*P_Watchdog_Clear = 0x0001;
uiIOB = Get_IOB_Data();
uiIOB = uiIOB & 0x0003;
while(1)
{
switch (uiIOB)
{
case 0x0001:
{
TurnLeft();
iMoveFlag = 0x2400;
*P_Watchdog_Clear = 0x0001;
break;
}
case 0x0002:
{
TurnRight();
iMoveFlag = 0x1800;
*P_Watchdog_Clear = 0x0001;
break;
}
case 0x0003:
{
GoAhead();
iMoveFlag = 0x2800;
*P_Watchdog_Clear = 0x0001;
break;
}
case 0x0000:
{
StopCar();
iMoveFlag = 0x0000;
*P_Watchdog_Clear = 0x0001;
break;
}
default :
break;
}
}
}
*P_Watchdog_Clear = 0x0001;
}
void Delay()
{
unsigned int i;
for(i=0; i<0x3Fff; i++)
{
*P_Watchdog_Clear = 0x0001;
}
}
void GoAhead()
{
unsigned int j;
*P_IOB_Data = 0x2800;
for(j=0; j<40; j++)
Delay();
*P_IOB_Data = 0x0000;
}
void TurnLeft()
{
unsigned int j;
for(j=0; j<30; j++)
{
*P_IOB_Data = 0x2400;
Delay();
Delay();
*P_IOB_Data = 0x2800;
Delay();
}
*P_IOB_Data = 0x0000;
}
void TurnRight()
{
unsigned int j;
for(j=0; j<30; j++)
{
*P_IOB_Data = 0x1800;
Delay();
Delay();
*P_IOB_Data = 0x2800;
Delay();
}
*P_IOB_Data = 0x0000;
}
void StopCar()
{
unsigned int j;
*P_IOB_Data = 0x0000;
for(j=0; j<40; j++)
Delay();
*P_IOB_Data = 0x0000;
}
阻力太大,启动不了
先谢谢大家了,我确保电池装了,喇叭连了,跳线拔了,因为我用其他程序下进去小车是可以走的,传感器是用来探测黑线和白线的,从而进行循迹的!
我想是不和端口的设置有关吗???程序肯定是下进去了。
还有要是换成pwm控制电机,怎样实现的呢?我设置好了TimerA_Ctrl ,TimerA_Data 再怎么办呢???
谢谢!
肯定是不能运行的。
楼主的主程序中的那个uiIOB是不会变的。按照楼主的意思,估计IOB口是接键盘or something,第一次运行时,uiIOB的值应该是0,然后,uiIOB就再也不变了,CPU一直在执行switch(uiIOB)中的某一条分支(估计最大的可能就是执行case 0x0000或者default),当然不会有响应了
对啊,我的IOB0 IOB1接的是传感器的输入信号么,哦,那程序应该怎么改呢??
还有要是换成pwm控制电机,怎样实现的呢?我设置好了TimerA_Ctrl ,TimerA_Data 再怎么办呢???
把主程序内层while循环去掉就可以了。那是多余的
关于PWM,呵呵,抱歉,到目前为止还没怎么做过电机驱动 ^_^
int main(void)
{
*P_IOB_Dir = 0xffff;
*P_IOB_Attrib = 0xffff;
*P_IOB_Data = 0x0000; //设置IOB为同相低电平输出
*P_TimerA_Data=0xfffa;
*P_TimerA_Ctrl=0x0234; //初始化PWMA
*P_TimerB_Data=0xfffa;
*P_TimerB_Ctrl=0x0234; //初始化PWMB
while(1)
{
*P_Watchdog_Clear = 0x0001; //清看门狗
}
}
可是我刚开始,具体是怎用pwm控制电机呢? 我想控制两个电机,通过对他们转速的调节实现小车的转弯,这样可以吗???
是怎么做的呢???
谢谢各位大侠了!!!1
真快,都已经回复了
解释一下程序:
硬件连接:IOB8(APWM)、IOB9(BPWM)分别作为两个电机的开关信号
软件部分:初始化IO、Timer后,IOB8、9就会自动产生PWM波形了,改变PWM占空比调节平均电压。
哦,那要是加上控制电机的话是不
int main(void)
{
*P_IOB_Dir = 0xffff;
*P_IOB_Attrib = 0xffff;
*P_IOB_Data = 0x0000; //设置IOB为同相低电平输出
*P_TimerA_Data=0xfffa;
*P_TimerA_Ctrl=0x0234;
*P_IOB_Data = 0x2800; Delay();// 延迟就可以了呢
while(1)
{
*P_Watchdog_Clear = 0x0001; //清看门狗
}
}
这样算pwm控制电机吗???
*P_IOB_Data = 0x2800; Delay();// 延迟就可以了呢
你这句加上也不会起作用的,PWM输出马上就会把你的赋值给改变。
也就是说当下一个PWM输出到了之后,你对IOB的赋值就会被PWM更改。
你不妨这样,把PWM初始化发到下面。
如:
int main(void)
{
*P_IOB_Dir = 0xffff;
*P_IOB_Attrib = 0xffff;
*P_IOB_Data = 0x0000; //设置IOB为同相低电平输出
*P_IOB_Data = 0x2800; Delay();// 延迟就可以了呢
*P_TimerA_Data=0xfffa;
*P_TimerA_Ctrl=0x0234;
while(1)
{
*P_Watchdog_Clear = 0x0001; //清看门狗
}
}
哦,请问哪怎样才能使pwm的输出不会影响控制电机呢??
我用四个口 IOB10 ,IOB11 ,IOB12,IOB13 来控制两个电机。
谢谢:》
1.你不需要的时候把PWM给关掉就行了,需要的时候再打开就OK了
2.你自己想办法吧,反正硬件的PWM只能由IOB8、9输出,你可以改变硬件连接,也可以扩展电路,都能够实现的,如果觉得麻烦烦的话,就用软件虚拟好了,任何一个IO都可以实现的!
恩,我明白了,可是放在我循迹小车的主程序里边,那他怎样才能实时跟据传感器的信号,来对两个电机实现不同的pwm调速,实现小车的转弯呢???
真得很感谢大哥们啊!!!!!
IOB8、IOB9初始化为输出PWM后,还可以实时更改其输出参数吗?
IOB8、IOB9初始化为输出PWM后,还可以实时更改其输出参数吗?
不太明白你的意思?是更改PWM的占空比还是想改变端口的状态?
两种都是可以的:
1.修改占空比:只要你修改了PWM的相关控制寄存器(定时器的Ctrl和Data),输出就会在立即更改!
2.改变端口状态:关闭PWM功能,然后对端口进行操作就可以了,注意一定要关闭PWM,否则操作会被PWM输出信号覆盖.
不知回答的对不对你的问题?
不太明白你的意思?是更改PWM的占空比还是想改变端口的状态?
两种都是可以的:
1.修改占空比:只要你修改了PWM的相关控制寄存器(定时器的Ctrl和Data),输出就会在立即更改!
2.改变端口状态:关闭PWM功能,然后对端口进行操作就可以了,注意一定要关闭PWM,否则操作会被PWM输出信号覆盖.
不知回答的对不对你的问题?
正是我想知道的 ^_^
[em17][em17][em17]
[em17][em17][em17][em17][em17][em17][em17][em17]