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

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

试试这个吧,我用过的

#include<hidef.h>

//#include <math.h>

// #include <mc9s12xs128.h>

#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=0i<=3i++) {

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 */

}

唉,老是见到你,教你一个万能的方法,用初中物理的研究方法简培:控制变量法!改变你要研究的因素,其他因素控制卖咐敏不变。要知道是不是舵机的问题就更换一个肯定正常的舵机(没有就问人借),其他东西都不要变!问题解决就是舵机的问题,没解决就不中枝是舵机的问题咯!其余的如此类推!:em08:

最后你肯定能发现问题所在的,在这里你这样问是得不到答案的啊!因为这种问题是根本说不清的。:em16:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12309050.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存