|
为什么我的这个程序无法让舵机动起来,请大佬指教
#include "./EEPROM/EEPROMH.H"
#include "./I2C/I2CH.H"
#include <stdio.h>
#include <math.h>
void delayms(u32 z)
{
u32 x,y;
for(x=z;x>0;x--)
for(y=148;y>0;y--);
}
void PCA9685_write(u8 address,u8 date)
{
I2C_START();
I2C_WRITE_BYTE(PCA9685_adrr); //PCA9685的片选地址
I2C_ACK();
I2C_WRITE_BYTE(address); //写地址控制字节
I2C_ACK();
I2C_WRITE_BYTE(date); //写数据
I2C_ACK();
I2C_STOP();
}
u8 PCA9685_read(u8 address)
{
u8 date;
I2C_START();
I2C_WRITE_BYTE(PCA9685_adrr); //PCA9685的片选地址
I2C_ACK();
I2C_WRITE_BYTE(address);
I2C_ACK();
I2C_START();
I2C_WRITE_BYTE(PCA9685_adrr|0x01); //地址的第八位控制数据流方向,就是写或读
I2C_ACK();
date=I2C_READ_BYTE();
I2C_STOP();
return date;
}
void reset(void)
{
PCA9685_write(PCA9685_MODE1,0x0);
}
void begin(void)
{
reset();
}
void setPWMFreq(float freq)
{
u16 prescale,oldmode,newmode;
float prescaleval;
freq *= 0.92;
prescaleval = 25000000;
prescaleval /= 4096;
prescaleval /= freq;
prescaleval -= 1;
prescale = floor(prescaleval + 0.5f);
oldmode = PCA9685_read(PCA9685_MODE1);
newmode = (oldmode&0x7F) | 0x10;
PCA9685_write(PCA9685_MODE1, newmode);
PCA9685_write(PCA9685_PRESCALE, prescale);
PCA9685_write(PCA9685_MODE1, oldmode);
delayms(2);
PCA9685_write(PCA9685_MODE1, oldmode | 0xa1);
}
void setPWM(u16 num, u16 on, u16 off)
{
PCA9685_write(LED0_ON_L+4*num,on);
PCA9685_write(LED0_ON_H+4*num,on>>8);
PCA9685_write(LED0_OFF_L+4*num,off);
PCA9685_write(LED0_OFF_H+4*num,off>>8);
}
int main(void)
{
begin();
setPWMFreq(50);
while(1)
{
setPWM(12, 0, SERVO000);//第12路舵机转到0角度
delayms(1500);
}
}
|
-
-
舵机.7z
176.29 KB, 下载次数: 12
这是我的工程
|