打印

求助,急!!!!!!!!!!!!

[复制链接]
1248|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
609044735|  楼主 | 2012-9-23 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
EPS中用pwm控制电机,转矩连续变化时A/D转换控制占空比,当占空比是连续变化的,pwm为什么有几处不随着占空比改变而改变,有跳跃
沙发
NE5532| | 2012-9-23 21:43 | 只看该作者
确认没看懂,请楼主再描述一下。

使用特权

评论回复
板凳
609044735|  楼主 | 2012-9-24 11:14 | 只看该作者
好,电动助力转向系统的控制单元中用的是PIC单片机。转矩传感器检测到转矩后,单片机根据转矩的大小控制电机的转动。用pwm控制电机的转速,转矩控制占空比。在仿真时,转矩连续变化,示波器检测到的pwm波没有连续变化,有两处跳跃的现象。检查过程序了,没有错误啊。难道跟硬件有关吗啊?希望高手指点指点,谢谢

使用特权

评论回复
地板
609044735|  楼主 | 2012-9-24 11:19 | 只看该作者

void ADC1_Init(void)
{
TRISA0=1;                //模拟通道0设置为输入         
ADCON1=0b10000010;//配置引脚工作方式,转换结果右对齐
ADCON0=0b00000001;//使用单片机主频二分频作为转换时钟,选择通道0进行AD转换
}
void InitAPWM()
{   
TRISC2=0;//RC2作为PWM模式输出引脚
T2CKPS1=0;
T2CKPS0=0;//TMR2预分频比为1:1,且使能TMR2模块
PR2=249;//PR2=(1/16KHZ)/(4*(1/16MHZ)-1=249(PWM模式周期/(4*Tosc*TMR2预分频值))-1
CCPR1L=((uint8)(wide>>2))&0x0FF;
if((((uint8)(wide>>1))&0x01)==1) CCP1X=1;
else CCP1X=0;
if((((uint8)wide)&0x01)==1) CCP1Y=1;
else CCP1Y=0;
CCP1M3=1;
CCP1M2=1;
CCP1M1=0;
CCP1M0=0;
TMR2ON=1;
}
void InitBPWM()
{   
TRISC1=0;//RC2作为PWM模式输出引脚
T2CKPS1=0;
T2CKPS0=0;//TMR2预分频比为1:1,且使能TMR2模块
PR2=249;
CCPR2L=((uint8)(wide>>2))&0x0FF;
if((((uint8)(wide>>1))&0x01)==1) CCP2X=1;
else CCP2X=0;
if((((uint8)wide)&0x01)==1) CCP2Y=1;
else CCP2Y=0;
CCP2M3=1;
CCP2M2=1;
CCP2M1=0;
CCP2M0=0;
TMR2ON=1;
}

void interrupt ISR(void)  //定时中断服务程序
{

double rOut;
double rIn;
if(T0IF==1)
{

  T0IF=0;               //清空标志

g_ACC++;
if(g_ACC==500)         //等于500说明1s了
{
   RB4=~bFlag;          //RB2口求反
   bFlag=RB4;
   g_ACC=0;             //累加器清零
//EEPROM_Write(0x00,(uint8)spid.Proportion);//写0x00地址
//EEPROM_Write(0x01,(uint8)spid.Integral);  //写0x01地址
//EEPROM_Write(0x02,(uint8)spid.Derivative);//写0x02地址
//EEPROM_Write(0x00,0x55);
//EEPROM_Write(0x01,0x11);
//EEPROM_Write(0x02,0x22);

}
   ADGO=1;               //启动AD转换
while(ADGO){}
torque=0;
  torque=(((uint16)ADRESH)<<8)+ADRESL; //获得十位转换结果
  //spid.Setpoint=(double)torque;   //r(t)
  //ADC2_Init();
  //ADGO=1;               //启动AD转换
  //while(ADGO){}
  //current=(((uint16)ADRESH)<<8)+ADRESL; //获得十位转换结果
  //rOut=(double)current;            //y(t)
  //rIn=PIDCalc (&spid,rOut); //u(t)

  if(torque<=(512-10))//电机反转
  {
   uint16 motor_left=0;
   motor_left=512-10-torque;  
   wide=(uint16)((long)motor_left*1000/502);
   InitAPWM();
   wide=0;
   InitBPWM();
  }
  
  else if(torque>=(512+10))//电机正转
  {
   uint16 motor_right=0;
   motor_right=torque-512-10;  
   wide=(uint16)((long)motor_right*1000/502);
   InitBPWM();
   wide=0;
   InitAPWM();
  }
  
  else//电机停止
  {
   wide=0;
   InitAPWM();
   InitBPWM();
  }

}




}


部分代码

使用特权

评论回复
5
NE5532| | 2012-9-24 21:24 | 只看该作者
先把程序砍开,用串口之类的输出转矩测量数据,将整个转矩工作范围砍成N个线性区间,施加这些数值的转矩,并记录数据,绘制曲线观察其是否线性,再通过测试程序模拟N个点的PWM输出,同上测试,即可找到真相。

基本原理:要善于把复杂系统划分为模块进行调试,不要胡子眉毛一把抓。

使用特权

评论回复
6
609044735|  楼主 | 2012-9-25 09:23 | 只看该作者
谢谢,已经找到问题了。是A/D的配置位除了问题,改为自带的RC就没有问题了

使用特权

评论回复
7
兰天白云| | 2012-9-25 14:46 | 只看该作者
谢谢,已经找到问题了。是A/D的配置位除了问题,改为自带的RC就没有问题了
609044735 发表于 2012-9-25 09:23

真正原因还为找到吧

使用特权

评论回复
8
609044735|  楼主 | 2012-9-27 17:04 | 只看该作者
是的,不知道为什么会这样

使用特权

评论回复
9
兰天白云| | 2012-9-28 13:39 | 只看该作者
AD的采样时间是有规定的,太短了肯定不行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

5

帖子

0

粉丝