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

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

Rancho 瑞萨单片机开发手记 进程帖(直流电机调速-有图有视频有说明)

高工
2012-08-15 11:11:47     打赏
【2012年7月31日】报名申请开发板
【2012年8月第一二周】准备工作  学习瑞萨单片机准备 
【2012年8月15日】
开发板收到 与YRPBRL78G13-Demo连接失败
【2012年8月16日】看文献,上手阶段

各项目实验情况
定时器应用 【2012年8月24日】 05楼
AD应用  【2012年8月28日】  12楼
GPIO中断  【2012年8月25日】  13楼
LED跑马灯  【2012年8月25日】  14楼
RS232  【2012年8月26日】  15楼
蜂鸣器  【2012年8月30日】  20楼
LCD驱动  【2012年9月1日】  21楼
LCD+RTC  【2012年9月2日】  25楼
PWM模块实验直流电机+AD+LCD  【2012年9月4日】  26楼
 串口烧录  【2012年9月3日】  27楼
ucod 移值,流水灯  【2012年9月3日】  28楼
步进电机控制  【2012年9月4日】  29楼
  外接SPI    
 SPI模式SD卡读写    
  EEPROM仿真实现    
 低功耗运行    
     
     
     







关键词: Rancho     瑞萨     单片机     开发     手记     进程     直流    

高工
2012-08-15 11:24:51     打赏
2楼

沙发自己坐着。


高工
2012-08-17 08:10:31     打赏
3楼
此板做工精致,可就得一个LED,10K可调电阻(估计是做AD实验用),还有就是J3接口,可以用来检测MCU电流,8月14号TI的电机交流会见过一些也是做成这样的,很多测试脚引出,并通过磁珠引出防干扰。焊完排针,点亮LED,可装上光盘的YRPBRL78G13-Demo连接不上。

高工
2012-08-25 16:47:48     打赏
4楼
RL78G13,定时器模块我进程

有8个定时器
看箭头对应的引脚,ch0的P00只能作为输入,P01只能作为输出,而 ch1,ch2,ch3,ch4,ch5,ch6对应的引脚可以两用,同理ch7一样,加了括号只是这个功能用在那个引脚上。
在Applilet3功能设置上可以看到,觉得瑞萨这个有点特别


channel0,channel2,channel4,channel6,的功能比较多,定时作用,外部事件计数,脉冲输入周期检测,脉冲宽度检测,PWM输出,多通道PWM输出等,我觉得脉冲输入周期检测,脉冲宽度检测这两个很好用,刚好愁着频率跟占空比的检测方法,这个内部还集成噪声滤波器,使能就可以。多能PWM输出时,ch0作为周期设定,其它的控制占比,这个可以用来驱动步进电机,8个,刚好作为2相的步进电机驱动器控制,用6个可以驱动交流电机驱动器。至于Interval timer是用于一般的定时用,square wave output,什么方波输出,PWM不是很好的实现,一个定时器,怎输出方波,这个不是很理解,而divider function,分频功能,也不是不理解,事件计数器,很好理解,通过外部上升,下降延来做为事件的触发源,计数,到达设定的次数(在里面有输入窗口)就进入中断,然后做自己想做的事,在下面有个例子。Input pulse interval measurement 是测量脉冲周期,Iput pulse high-/low-level width measurement可以测量脉冲高或低电平的宽度,与前面一除就知道占空比了,最大16M,有待验证,我自己要测的是100K左右,应该可以很好实现。Delay count function这个也不知道用在那比较合适,也是太理解,延时计数功能....PWM output也就是用两个定时器实现PWM,也是跟PWM相似的吧,也没用过,不知道适合用在那。最后一个multi PWM,几路PWM,也好理解。
一般定时中断功能
在Applilet3设计完后,在main函数写上CG_timer.C的
void  main(void)
{
  TAU0_Channel0_Start();//加入的,等于是对定时器的使能吧
 /* Start user code. Do not edit comment generated here */
 while (1U)
 {
  ;
 }
 /* End user code. Do not edit comment generated here */
}

然后在
CG_timer_user.C的中断函数加入自己要实现的功能。LED灯
#pragma vector = INTTM00_vect
__interrupt void MD_INTTM00(void)
{
    P7=~P7;//我加入LED闪烁
    delay(1000);
 /* Start user code. Do not edit comment generated here */
 /* End user code. Do not edit comment generated here */
}
最好一次设置成功,第二次设置,IAR会reload更新,看的是自己写的程序,可关掉后双击打开就会回到原来的设置,关掉后在Project ----Add Exiting Porject打开重新编写,我发现里面的几个文件,可这样太乱了,不知有什么方法可以解决,不改写好的程序,又要更新applilet的设置。

利用两个定时器实现这PWM output,更简单点,设计完后,在main里加入CG_timer.C的
void  main(void)
{
  TAU0_Channel0_Start();//加入的
 /* Start user code. Do not edit comment generated here */
 while (1U)
 {
  ;
 }
 /* End user code. Do not edit comment generated here */
}

输入捕获功能,外部事件计数,我在外部接一个开关,上升延检测,10次LED换一次


这跟定时中断一样的,设置完后,要改的程序也一样,只时中断不是定时本身计数,而是通过外部事件,10次(这可以修改)中断一次。这我也是第一次用到这功能。

至于检测脉冲周期跟脉宽的检测应用,在后面会用到,我要做的就需要检测这个占空比的。

我不理解这个定时器输出比较功能是什么(在项目要求中写到的),知者说说

高工
2012-08-25 20:08:40     打赏
5楼
指的是,这次活动的要求,技术分中的求

高工
2012-08-26 16:17:12     打赏
6楼

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

/* End user code. Do not edit comment generated here */之间,非常多谢


高工
2012-08-28 11:03:38     打赏
7楼
外部电压检测,AD采样实现
先看看R5F100LEAFB外部ADblock

P20-P27+P03+P02+P147+P120,可以有12通道,操作模式有


连续选择,连续扫描,单次选择,单次扫描四种,我的理解,连续应该是保持一定时时间测的值,就是延时一定时间所得到的值,而单次是像离散采集点,这两种模式,如果所测电压变化不快,用连续模式,如果变化很突然,用单次的模式比较适合。而选择跟扫描,那是跟选择通道有关,多通道一起使用,那就需要扫描模式。
讲完这个,我的是用单通道P20作为AD输入,转换AD为电压值,通过串口发到电脑里。




/*主要程序:*/
void  main(void)
{
 /* Start user code. Do not edit comment generated here */
  UART0_Start();
  AD_ComparatorOn();
  AD_Start();
 while (1U)
 {
          sendmessage[0]=(UCHAR)(voltage/10000+48);//加48是ASCII码的转换
          
          sendmessage[2]=(UCHAR)((voltage%10000)/1000+48);
          sendmessage[3]=(UCHAR)(((voltage%10000)%1000)/100+48);
 //         sendmessage[4]=(UCHAR)((((voltage%10000)%1000)%100)/10+48);
//          sendmessage5=(UCHAR)((((voltage%10000)%1000)%100)%10);
          UART0_SendData("当前AD转换值:", 14);
          delay(1000);
          UART0_SendData(sendmessage, 4);
          delay(100);
          UART0_SendData("V\r\n", 3);
          delay(1000);
         
 }
 /* End user code. Do not edit comment generated here */
}
/*电压转换:*/
#pragma vector = INTAD_vect
__interrupt void MD_INTAD(void)
{
 /* Start user code. Do not edit comment generated here */
    AD_Read(&AD_Reg_Value);
    voltage=48*AD_Reg_Value+2;//这是按直线换算,其实觉得有点偏差,更像抛物线
 /* End user code. Do not edit comment generated here */
}
/*AD初始化,这是在Applilet3里面产生的,没改动过*/
void AD_Init(void)
{
 ADCEN = 1U; /* supply AD clock */
 ADM0 = _00_AD_ADM0_INITIALVALUE; /* disable AD conversion and clear ADM0 register */
 ADMK = 1U; /* disable INTAD interrupt */
 ADIF = 0U; /* clear INTAD interrupt flag */
 /* Set INTAD low priority */
 ADPR1 = 1U;
 ADPR0 = 1U;
 ADPC = _02_AD_ADPC_1ANALOG;
 /* Set ANI0 pin as analog input */
 PM2 |= 0x01U;
 ADM0 = _00_AD_CONVERSION_CLOCK_64 | _00_AD_TIME_MODE_STANDARD_1 | _00_AD_OPERMODE_SELECT;
 ADM1 = _00_AD_TRIGGER_SOFTWARE | _00_AD_CONVMODE_CONSELECT;
 ADM2 = _00_AD_POSITIVE_VDD | _00_AD_NEGATIVE_VSS | _00_AD_AREA_MODE_1 | _00_AD_RESOLUTION_10BIT;
 ADUL = _FF_AD_ADUL_VALUE;
 ADLL = _00_AD_ADLL_VALUE;
 ADS = _00_AD_INPUT_CHANNEL_0;
}

个人总结:串口输出时,原先没加48进行ASCII转换,因为是字符,所以输出的电压值是乱码,后来,检查PC收到的16进制代码分析,才发现是对应的ASCII码




有底纹的是我要的数据,再看

仿真查看AD_Reg_Valve的值通过工式voltage=48*AD_Reg_Value+2,的值很相似,这是我才发现转换的跟发送都没错,只是发送时对应电脑里的ASCII,对照
最全ASCII码对照表.doc
这才发现只是差了一个48,这个问题在以前也遇到过,可这次,弄了大半天才找出最终原因,脑子不好使了....
电脑上接收到的数据:


视频:





高工
2012-08-28 11:25:47     打赏
8楼
GPIO 中断,利用以前的51开发板S17作为按钮,实现板上的灯一按就亮。
先看看KEY  RETURN block



用过之后,觉得这个功能很适合做游戏机的操作按钮,需要反应快,有独立的中断,省去繁琐的键盘扫描之类的,这也许是为日本游戏机而做的,不知是不是这个原因,日本的游戏机这么好,这只是很少的一部分,呵呵,寡闻,用过其它类型的芯片,真没像这个有独立的按钮中断,题外....
先用Applilet3设置产生代码:





这是通过按钮中断,实现板上LED灯亮,
主要程序:
void  main(void)
{
    
 /* Start user code. Do not edit comment generated here */
        KEY_Enable();//
 while (1U)
 {
  P7&=~0x80;
   delay(1000);
 }
 /* End user code. Do not edit comment generated here */
}


中断程序;
#pragma vector = INTKR_vect
__interrupt void MD_INTKR(void)
{
  /* Start user code. Do not edit comment generated here */
   P7 |= 0x80;
   delay(1000);
   /* End user code. Do not edit comment generated here */
}
KEY初始化:
void KEY_Init(void)
{
 KRMK = 1U; /* disable INTKR operation */
 KRIF = 0U; /* clear INTKR interrupt flag */
 /* Set INTKR high priority */
 KRPR1 = 0U;
 KRPR0 = 0U;
 KRM = _01_KR0_SIGNAL_DETECT_ON | _00_KR1_SIGNAL_DETECT_OFF | _00_KR2_SIGNAL_DETECT_OFF | _00_KR3_SIGNAL_DETECT_OFF | _00_KR4_SIGNAL_DETECT_OFF | _00_KR5_SIGNAL_DETECT_OFF | _00_KR6_SIGNAL_DETECT_OFF | _00_KR7_SIGNAL_DETECT_OFF;
 /* Set KR0 pin */
 PM7 |= 0x01U;
}


视频:






视频地址:http://player.youku.com/player.php/sid/XNDQ0MTE0ODk2/v.swf





高工
2012-08-28 11:31:42     打赏
9楼
LED跑马灯,很简单,就不详细了,发几张图,跟视频


利用51开发板上的P11,P12,P13,P14实现流水灯功能
视频:

视频地址:http://player.youku.com/player.php/sid/XNDQ0MTE0NjQw/v.swf





















高工
2012-08-28 11:42:50     打赏
10楼
UART与PC机实现收发功能
Applilet3 设置



串口调试窗口:





正确实返回的值,板上LED灯在闪




如果输入错误,重新输入




错误再次输入正确,LED重新闪烁。

视频;


视频地址:http://player.youku.com/player.php/sid/XNDQ0MTE2MDI0/v.swf











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

回复

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