金牌会员
- 积分
- 1408
- 威望
- 756
- 贡献
- 362
- 兑换币
- 369
- 注册时间
- 2012-11-3
- 在线时间
- 145 小时
|
我想通过赛道检测来使舵机能够简单的左右摆,下面这程序问题出在哪,一点反应都没有啊,有没大神能帮忙看看啊,ad虽然设置了8个通道,不过我只用了0和1 来做简单那检测
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#define uint unsigned int
#define uchar unsigned char
uchar ad_result[8]; //AD转换数值
int road;
int dd=200;
uint ref=3000;
uint OUTPUT;
/////////////////////////////
void ADInit(void)
{
ATD0CTL1=0x00;
ATD0CTL2=0X40; /* 使能AD,清除标志 */
ATD0CTL3=0XB0; /* 队列长度为6,依次存入结果寄存器,继续转换 */
ATD0CTL4=0X05; /* 8位精度,总线频率32分频 */
ATD0CTL5=0X30; /* ,多通道,连续,从AD0开始转换*/
ATD0DIEN=0x00; //禁止数字输入
}
////////////////////////////////
//**************************************************************************
//
//获取AD转换数值的函数
//
//**************************************************************************
void Rd_Ad_Value(void)
{
while(!ATD0STAT0_SCF); //等待转换完成
// ATD0STAT0 ATD转换状态寄存器0
// SCF - ETORF FIFOR CC3 CC2 CC1 CC0
// SCF: 转换序列完成标志,=1,转换完成,写ATD0CTL5被清0
// ETORF: 外部边沿触发溢出标志位。ETIGLE=0时,当ATD转换正在进行过程中检测到外部边沿触发信号,该位被置1
// FIFOR: 先入先出溢出标志位
// [CC3:0]: 转换计数,表示当前转换的结果将要写入的结果寄存器的编号。
// ATD0CTL3_FIFO=0时,在转换开始和转换结束时候[CC3:0]都会被初始化为0
//一次过取出八个通道的AD值
ad_result[0]=ATD0DR0L;
ad_result[1]=ATD0DR1L; //演示时使用【正中间】的传感器
ad_result[2]=ATD0DR2L;
ad_result[3]=ATD0DR3L;
ad_result[4]=ATD0DR4L;
ad_result[5]=ATD0DR5L;
ad_result[6]=ATD0DR6L;
ad_result[7]=ATD0DR7L;
}
/*****舵机方向信号源pwm如下*************************/
// pwm通道23级联
void init_PWM()
{
PWME_PWME3=0;//关闭3通道
PWMCTL_CON23=1;//23级联
PWMCLK_PCLK3=1;//设0,1通道SB为其时钟源
PWMPRCLK=0x08;//对总线时钟进行预分频,总线时钟为32M,分频后为32M/2=16M
PWMSCLB=0X08;//8位 clock SB=Clock B/(2*PWMSCLA) clock SB=16M/(2*8)=1M
PWMPOL_PPOL3=1;//起始时为高电平
PWMCAE_CAE3=0;//左对齐
PWMPER23=20000;//输出频率为50HZ,周期20ms
PWME_PWME3=1;//通道使能
}
void set_road(void)
{
if(ad_result[0]<ad_result[1])
road=0;
else
if(ad_result[0]>ad_result[1])
road=1;
else
if(ad_result[0]=ad_result[1])
road=2;
}
void set_direction(void)
{
set_road();
switch(road)
{
//////////////////////////////////////////////////
case 0: OUTPUT=ref+dd ;
break;
////////////////////////////////////////////////
case 1:
OUTPUT=ref-dd;
break;
////////////////////////////////////////////////////////////////
case 2:
OUTPUT=ref;
break;
}
PWMDTY23 = OUTPUT;
}
////////////////////////////////////////////////////////////////////////////////////
//*******************************
void SetBusCLK_32M(void)
{
CLKSEL=0X00; // disengage PLL to system
PLLCTL_PLLON=1; // turn on PLL
SYNR =0x40 | 0x03; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=64MHz;
REFDV=0x80 | 0x01;
POSTDIV=0x00;
_asm(nop); // BUS CLOCK=32M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void main(void)
{
SetBusCLK_32M();
ADInit() ;
Rd_Ad_Value() ;
init_PWM();
for(;;)
{
set_direction() ;
}
}
|
|