这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Renesas » Rancho 瑞萨单片机开发手记 进程帖(直流电机调速-有图有视频有说明)

共30条 3/3 1 2 3 跳转至
高工
2012-09-01 21:35:00     打赏
21楼
Nokia 5110 LCD 驱动
通过IO口的普通输出功能,软件IIC驱动5110 LCD。
在当中走了很多弯路,一是一开始用P2口驱动,后来查了Datasheet才发现P2口要外部上拉电阻,



后来就用了P5口驱动,这是发现LCD_back_lighton();时LCD时P2.7口没有输出高电平,查了Datasheet才知道。还有就是操作IO是,不及明白操某个IO时是如何的,后来问了hanshuyujifen才知道是要这样定义的#define LCD_CS     P5_bit.no0。知道这两个问题好,下面的就好办了。
利用以前做的板上的3.3V为5110供电,









院士
2012-09-01 21:38:39     打赏
22楼
嘿嘿,又是5110
勤问是一个好习惯啊~

高工
2012-09-01 21:48:27     打赏
23楼
有什么驱动什么吧,没钱买12864,有人问是很的资源,这么好的资源是好好用的

院士
2012-09-01 22:34:34     打赏
24楼
还没钱买呢~~
12864的大个LCD,要连10+根线,可烦了。
做了一个demo程序后,直接被我放在一边了。
唉……

高工
2012-09-02 20:45:12     打赏
25楼

LCD5110+RTC
applilet3设置

首先要使能Subsystem clock(FSUB),选择XT1 外部晶振,选择Normal低功耗模式设置支不支持也没所谓。






这个是RTC页面设置
问题不大。
看图:


暂时还没有加上按钮设置初始时间,能过设置得到的初始时间,还需要加按钮设置,这个问题也不大。
代码:
void RTC_ConstPeriodInterruptCallback(void)
{
 /* Start user code. Do not edit comment generated here */
        UINT time_flag=0;
        struct RTCCounterValue time;
        RTC_CounterGet(&time);
       
       if(time_flag==0)
       {
        year_month_day[3]=(UCHAR)((time.Year & 0x0F)+0x30);//看操作形式,这里弄了好久才搞定,总结多看例子
        year_month_day[2]=(UCHAR)((time.Year >> 4)+0x30);
       
        year_month_day[6]=(UCHAR)((time.Month & 0x0F)+0x30);
        year_month_day[5]=(UCHAR)((time.Month >> 4)+0x30);
       
        year_month_day[9]=(UCHAR)((time.Day & 0x0F)+0x30);
        year_month_day[8]=(UCHAR)((time.Day >> 4)+0x30);

       }

        hour_min_sec[1]=(UCHAR)((time.Hour & 0x0F)+0x30);
        hour_min_sec[0]=(UCHAR)((time.Hour >> 4)+0x30);

        hour_min_sec[4]=(UCHAR)((time.Min & 0x0F)+0x30);
        hour_min_sec[3]=(UCHAR)((time.Min >> 4)+0x30);

        hour_min_sec[7]=(UCHAR)((time.Sec & 0x0F)+0x30);
        hour_min_sec[6]=(UCHAR)((time.Sec >> 4)+0x30);
        if((hour_min_sec[0]=='5')&(hour_min_sec[1]=='9')&(hour_min_sec[6]=='5')&(hour_min_sec[7]=='9'))
        {
          time_flag=0;
        }
  if(time_flag==0)
  {
     LCD_putstr(0,4,year_month_day);
     delay_ms(2); 
     time_flag=1;
  }
     LCD_putstr(0,5,hour_min_sec);
     delay_ms(2);
    
 /* End user code. Do not edit comment generated here */
}

总结:
当中最要是这个函数year_month_day[3]=(UCHAR)((time.Year & 0x0F)+0x30);当中转换是这样子的time.Year & 0x0F,之前没有加上这个,数字在9跳变一次,16跳变一次,后来发现规律,在官网看了一个例子,证实转换的问题,也就能显示了,接着是发出时间跟实际差很远,猜想是时钟选择问题,看了初始化,发现OSMC = _80_CG_SUBINHALT_OFF | _00_CG_RTC_CLK_FSUB;原来的是OSMC = _10_CG_RTC_CLK_FIL;,刚开始时改变这这个,没有显示,想是没全能吧,就看到第一张图,里面的FSUB时钟没有使能,使能后就能显示了。这个例子还比较顺利.....有时间再加上按钮时间设置,这要到后面整体弄....

视频:http://v.youku.com/v_show/id_XNDQ2MDc0MjQw.html


高工
2012-09-04 15:42:23     打赏
26楼

直流电机PWM调速控制系统(只是控制部分,电机驱动部分迟点有时间再加,采用IR2110+IGBT方式)
功能主要包括:

1) 直流电机的正转;

2) 直流电机的反转;

3) 电阻调速;

4) 正转,反转速度显示(LCD5110)

5) 直流电机的停止;
 

正转,反转,停止按钮(采用KR0,KR1,KR2按钮中断)



电阻调速部分


显示,87r/s


示波器显示





这个占空比是通过改变chanel1和12记算得到的reg = (reg + 1) * ratio / 100U;


总结,
1:I/O口中断时,外部电路要接好才可以,原先只用51开发板上的一个按钮,可使能了3个,没有反应,后来通过取消,不改变其它程序的方法发现这个问题。
按钮中断程序
#pragma vector = INTKR_vect
__interrupt void MD_INTKR(void)
{
 /* Start user code. Do not edit comment generated here */

  if(P7_bit.no0==0)
  {
    stop_flag=0;
    reversal_flag=0;
    forward_flag=1;
  }
 
  if(P7_bit.no1==0)
  {
    stop_flag=0;
    forward_flag=0;
    reversal_flag=1;
  }
 
  if(P7_bit.no2==0)
  {
    stop_flag=1;
    reversal_flag=0;
    forward_flag=0;
  }
 

 /* End user code. Do not edit comment generated here */
}

2:用定时器输出PWM时,选择4通道时,1,3要为一组,2,4要为一组,不能1,2和3,4各为一组,试试,会发现波形不是想要的波形。一开始时就是这样,怎输出的波形不是想要,后来发现怎样操作,1,3,操作一个另一个也会变化,但是峰值很小,还以为要输出上拉,看了datasheet也不需要,就试着把1,3设为一组,就出来了。后来再看直流电机的驱动,需要2个通道就可以了,但想实现急刹,就是停步时实现两上管导通或者两下管同时导通。可刚这么一试,只是用定时器是不行的,应该要上管各加多一个与门,再用一个信号线实现同时上管导通或者下管导通。


精彩视频后续上传...


高工
2012-09-04 16:03:11     打赏
27楼
这个利用RFP出很容易实现,http://forum.eepw.com.cn/forum/main?url=http%3A%2F%2Fforum.eepw.com.cn%2Fforum%2F29%2F1瑞萨电子提供的资料很好,有时间试试第第三种.....

说说这RFP的一些细节问题








这里记得按一下Detail,然后再点Complete,







这也没什么的,不知叫不真正的串口下载,想不用板载上的,试过用51板上串口调试,老出错,看了瑞萨电子的文件后,应该很容易实现第三种的,可MD0跟MD1是那管脚...
这就写到这



高工
2012-09-04 17:01:03     打赏
28楼

ucOSII的移值,在http://micrium.com/page/home下载了原板的,ucOSII 还在学习中,借用别人的程序,实现了流水灯,我的任务见下面,写了一个LCD5110的,各个程序编译没错的,可下载就出现错误,不知是不是太大的原因,在找原因....
static void Task0_blink (void *p_arg)
{
  (void)p_arg;


 
  while (DEF_TRUE)
  {                                          /* Task body, always written as an infinite loop.        */
        BSP_LED_On (1);
        OSTimeDlyHMSM(0, 0, 0, 100);
        BSP_LED_On (2);
        OSTimeDlyHMSM(0, 0, 0, 100);
        BSP_LED_On (3);
        OSTimeDlyHMSM(0, 0, 0, 100);
        BSP_LED_On (4);
        OSTimeDlyHMSM(0, 0, 0, 100);
        BSP_LED_On (5);
        OSTimeDlyHMSM(0, 0, 0, 100);
        BSP_LED_On (4);
        OSTimeDlyHMSM(0, 0, 0, 100);
        BSP_LED_On (3);
        OSTimeDlyHMSM(0, 0, 0, 100);
        BSP_LED_On (2);
        OSTimeDlyHMSM(0, 0, 0, 100);

   }
}

视频:


高工
2012-09-04 17:08:53     打赏
29楼

主程序:
void  main(void)
{
 /* Start user code. Do not edit comment generated here */
     KEY_Enable();
     AD_ComparatorOn();
     AD_Start();
//     TAU0_Channel0_Start();
     LCD_init();
     LCD_back_lightoff(); 
     LCD_back_lighton();
     LCD_clear();
     LCD_putstr(0,0,"Hello EEPW !");
     delay_1s(2); 
     LCD_putstr(0,2,"The speed is:");
     delay_1s(2);
     TAU0_Channel3_Start();
    
 while (1U)
 {
         if(forward_flag==1|reversal_flag==1)
         {
           TAU0_Channel0_Start();
          
           if(forward_flag==1)
           {
            motor_forward();
           }
         if(reversal_flag==1)
           {
            motor_reversal();
           }
         }
         if(stop_flag==1)
           {
            motor_stop();
           }
 }
       
 /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
void motor_forward(void)
{
  UCHAR motor_speed_forward=0;
  motor_speed_forward=(UCHAR)motor_speed;
 
   
    TAU0_Channel2_ChangeDuty(0);

    delay_ms(3);
    TAU0_Channel1_ChangeDuty(motor_speed_forward);

//    TAU0_Channel0_Start();

}

void motor_reversal(void)
{
  UCHAR motor_speed_reversal;
  motor_speed_reversal=(UCHAR)motor_speed;
 

    TAU0_Channel1_ChangeDuty(0);

    delay_ms(3);
    TAU0_Channel2_ChangeDuty(motor_speed_reversal);

//    TAU0_Channel0_Start();
}

void motor_stop(void)
{
 //   TAU0_Channel0_Stop();
 //   delay_ms(3);
    TAU0_Channel1_ChangeDuty(0);
    TAU0_Channel2_ChangeDuty(0);

 
//    TAU0_Channel0_Start();
}

AD转换中断函数(AD数据读取<10,>1010是了为了设置对应0%-100%)
#pragma vector = INTAD_vect
__interrupt void MD_INTAD(void)
{
 /* Start user code. Do not edit comment generated here */
    AD_Read(&AD_Reg_Value);
    if(AD_Reg_Value<10)
    {
      AD_Reg_Value=10;
    }
    if(AD_Reg_Value>1010)
    {
      AD_Reg_Value=1010;
    }
    motor_speed=(AD_Reg_Value-10)/10;
 /* End user code. Do not edit comment generated here */
}

显示函数,得宜chanel13内部定时器更新速度显示,定时时间为100ms
#pragma vector = INTTM03_vect
__interrupt void MD_INTTM03(void)
{
 /* Start user code. Do not edit comment generated here */
        motor_speed_display();
 /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
 void motor_speed_display(void)
 {
     speed_display[1]=(UCHAR)((motor_speed%10)+0x30);
     speed_display[0]=(UCHAR)((motor_speed/10)+0x30);
     if(forward_flag==1|reversal_flag==1)
     {
     if(forward_flag==1)
     {
      LCD_putstr(0,3,"Forward ");
     }
     if(reversal_flag==1)
     {
      LCD_putstr(0,3,"Reversal ");
     }
     P7_bit.no7 =~ P7_bit.no7;
     }
     if(stop_flag==1)
     {
      LCD_putstr(0,3,"STOP     ");
     P7_bit.no7 =0;
     }
     LCD_putstr(0,4,speed_display);
     delay_ms(2);
    
 }

/* End user code. Do not edit comment generated here */


高工
2012-09-10 18:51:50     打赏
30楼
步进电机控制
步进电机驱动器L289,两相四线步进电机,采用8拍控制方式。



利用定时器中断查表方式控制IO口电平,可用了控制步进电机后就什么都不能做了,靠定时器中断方式或者延时,就不能用来做其它任务了,这款单片机不能用来做步进电机的控制器。是不是定时器还不会设置?




共30条 3/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]