|
|
為什么我的這個程序無法讓舵機動起來,請大佬指教
#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
2019-8-20 02:27 上傳
點擊文件名下載附件
176.29 KB, 下載次數: 12
這是我的工程
|