这个单片机控制舵机的程序 舵机会抖动 哪位大侠帮我改一下c程序?

2024-12-19 13:08:06
推荐回答(1个)
回答1:

试试这个吧,我用过的

#include
//#include
// #include
#include "derivative.h"
//#pragma LINK_INFO DERIVATIVE"mc9s12dg128b"

/*****定义变量******/

unsigned int a,c,d;
unsigned int AD_wValue,B; //AD转换结果

int b,i,x,e,j;
void LEDShow(int x);
/*****总线初始化*****/

void PLL_Init(void) {
REFDV=1;
SYNR=2;
while(!(CRGFLG&0x08));
CLKSEL=0x08;
}

/******AD初始化******/
/*void AD_Init() {
//ATD0CTL1=0x00;
ATD0CTL2=0xC0;//启动AD,快速清零,无等待模式,禁止外部触发,中断禁止
ATD0CTL3=0x40;//转换序列长度8
ATD0CTL4=0x85;
ATD0CTL5=0xA0;//右对齐无符号,单通道0采样
ATD0DIEN=0x00;//禁止数字量输入 */

/**读取AD转换结果**/
/*void AD_GetValue()
{
while(!ATD0STAT0_SCF); //等待转换结束
AD_wValue=ATD0DR0L;//读取结果寄存器的值

} */
/*****pwm初始化********/

void PWM_Init(void)
{
PWME_PWME1=0x00; // Disable PWM (PP1) 禁止

PWMCTL_CON01=1; //0,1级联,寄存器为通道1的
PWMCAE_CAE1=0; //通道7左对齐
PWMCNT01=0; // 计时器清零
PWMPOL_PPOL1=1; // 先置高电平,DYT反
PWMPRCLK=0; //COLCKA不分频
PWMSCLA=4; //COLCK SA进行16分频
PWMDTY01=1500; // 舵机静止占空比为7.5%=1500/20000
PWMPER01=20000; //周期20MS
PWMCLK_PCLK1=1; // CLOCK SA 作时钟源
PWME_PWME1=1;
}

/*舵机控制*/
void PWMDuo_Dutycycle(int d)
{
PWMDTY01=d;

PWME_PWME1=1; // Enable PWM 使能

}
void delay(long m){
while(m--);
}

/**************显示输出*******************/
const int Dtable[10] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
const int CStable[4] =
{0xF7,0xFB,0xFD,0xFE};
void LEDShow1(int i,int c)
{
PTT&= CStable[i];
PORTB = Dtable[c];
delay(100);
PTT|=0xff;
}
void LEDShow(int x){
DDRB=0xFF;
DDRT=0xFF;

b = x/10; //x=126 b=12
e=x-b*10; // e=6
x=b; // x=12

for(i=0;i<=3;i++) {
LEDShow1(i,e);
b = x/10; //b=1 //b=0 b=0
e=x-b*10; // e=2 e=1 e=0
x=b; // x=1 x=0 x=0

}
}

/******主函数*********/

void main(void) {

/*put your own code here*/
//EnableInterrupts;
DisableInterrupts;
PLL_Init();
ATD0CTL1=0x00;
ATD0CTL2=0xC0;//启动AD,快速清零,无等待模式,禁止外部触发,中断禁止
ATD0CTL3=0x80;//转换序列长度8
ATD0CTL4=0x83;
ATD0CTL5=0xA0;//右对齐无符号,单通道0采样
ATD0DIEN=0x00;//禁止数字量输入

PWM_Init();
for(;;)
{

while(!ATD0STAT0_SCF); //等待转换结束
AD_wValue=ATD0DR0;//读取结果寄存器的值

B=AD_wValue;

a=1150+(1000/250)*B;
if ( a>2000 )
{
a=2000;
}
else if(a<1000)
{
a=1000;
}
else{
a=a;
}

PWMDuo_Dutycycle(a) ;
LEDShow(a) ;

// _FEED_COP(); /* feeds the dog */
}/* loop forever */
/* please make sure that you never leave main */
}