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

共30条 2/3 1 2 3 跳转至
高工
2012-08-26 16:17:12     打赏
11楼

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

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


高工
2012-08-28 11:03:38     打赏
12楼
外部电压检测,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     打赏
13楼
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     打赏
14楼
LED跑马灯,很简单,就不详细了,发几张图,跟视频


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

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





















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



串口调试窗口:





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




如果输入错误,重新输入




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

视频;


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











院士
2012-08-28 13:40:55     打赏
16楼
这个问题并不是“只差48”的问题。
而是表示方法。
在RL78给的示例集里,有一个文件utlity.c 里面有如何将数字转换为BCD码及字符串的函数,楼主可以直接调用并处理待发送数据

高工
2012-08-28 14:38:07     打赏
17楼

那是转换问题


院士
2012-08-28 14:46:12     打赏
18楼
嘿嘿,正解~~

高工
2012-08-28 14:52:53     打赏
19楼
是了,用applilet3产生的代码没有你说的文件utlity.c,在那的

高工
2012-09-01 21:19:38     打赏
20楼

蜂鸣器驱动
蜂鸣器,一般我们是用来做为报警器用的,有时也可以作为音乐,可那需要事先编好一段改变PWM的程序,利用PWM的来控制,使蜂鸣器间断通电不同的时间,从而使声音产生变化,可那声音不怎好听,虽然大概也有点像,玩玩还可以。瑞萨RL78G13这单片机,有专门驱动蜂鸣器的模块,其它是时钟输出功能,只是可以用在驱动蜂鸣器才叫BUZZER OUTPUT吧,感觉这东西做为驱动蜂鸣器确实好用,有7种频率,可感觉M级频率的可以当成直流驱动一样,没什么区别吧那波型不怎样,都成了三角波,K级的还可以做不为不同的报警驱动信号,不用我们专门用定时来驱动,内部的BUZZER OUTPUT是一个独立的模块,只要使能,就自动工作,可以很方便改变输出PWM的频率,可是只有几种频率,但作为报警应该够用了。

下面是细说这模块的使用,我的例子同通过IO中断,按一下使输出的频率发生变化,循环变化。
时钟输入模块



采用P140作为输出

看图有七种方式,这频率还挺准确的,看图


这是其中一个



频率在K级以下波形都比较方。
视频:

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


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

回复

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