写一个使用51单片机,两个舵机,四个光敏电阻,pcf8951模块,组成的双轴追光电路的程序,并给出原理
时间: 2023-12-26 07:04:52 浏览: 238
双轴追光电路可以通过两个舵机控制相机的上下和左右移动,实现自动追踪光源的功能。下面是使用51单片机、两个舵机、四个光敏电阻和PCF8591模块实现双轴追光的程序和原理。
硬件电路:
将四个光敏电阻分别连接到PCF8591模块的AIN0-AIN3输入端口上,连接两个舵机分别控制相机的上下和左右移动。PCF8591模块的输出端口连接到51单片机的I2C总线上。
程序实现:
程序采用C语言编写,使用I2C库函数和PWM输出函数来控制舵机和PCF8591模块。
```
#include <reg51.h>
#include <i2c.h>
#include <pwm.h>
#define PCF8591_ADDR 0x90 // PCF8591模块地址
sbit Servo1 = P1^0; // 舵机1控制引脚
sbit Servo2 = P1^1; // 舵机2控制引脚
unsigned char adc_val[4]; // 保存光敏电阻的ADC值
// 函数声明
void ADCRead();
void ServoControl(int angle1, int angle2);
// 主函数
void main()
{
// 初始化I2C总线和PWM输出
I2CInit();
PWMInit();
// 循环读取光敏电阻ADC值并控制舵机
while(1)
{
ADCRead(); // 读取光敏电阻ADC值
ServoControl(adc_val[0], adc_val[1]); // 控制舵机
delay(100); // 延时一段时间,等待舵机运动到位
ServoControl(adc_val[2], adc_val[3]); // 控制舵机
delay(100); // 延时一段时间,等待舵机运动到位
}
}
// 读取光敏电阻ADC值
void ADCRead()
{
int i;
I2CStart(); // 发送启动信号
I2CWrite(PCF8591_ADDR); // 发送PCF8591地址
I2CWrite(0x40); // 发送控制字节,选择AIN0-AIN3通道和自动增量模式
I2CStop(); // 发送停止信号
I2CStart(); // 发送启动信号
I2CWrite(PCF8591_ADDR+1); // 发送PCF8591地址,读取模式
for(i=0; i<4; i++)
{
adc_val[i] = I2CReadACK(); // 读取ADC值,需要ACK
}
adc_val[3] = I2CReadNAK(); // 读取最后一个字节,不需要ACK
I2CStop(); // 发送停止信号
}
// 控制舵机
void ServoControl(int angle1, int angle2)
{
int pulse1, pulse2;
// 计算舵机PWM输出脉宽
pulse1 = 500 + angle1 * 10 / 9; // 舵机1脉宽范围为500-2500
pulse2 = 500 + angle2 * 10 / 9; // 舵机2脉宽范围为500-2500
// 控制舵机
PWMOut1(pulse1); // 舵机1控制
PWMOut2(pulse2); // 舵机2控制
}
```
原理:
光敏电阻产生的电压信号经过PCF8591模块的模数转换后,通过I2C总线传输到51单片机。程序读取ADC值后,计算出舵机的控制角度并输出PWM信号,通过调整PWM信号的占空比来控制舵机的转动角度。舵机的转动角度与光敏电阻的ADC值呈线性关系,由程序根据不同的光照条件计算出舵机应该转动的角度,从而实现相机的自动追踪光源的功能。
阅读全文