开箱后,开发套件主要是两个,下图一块主板,一个下载器。

图片1.png

板子到手,照着官网资料搭建好开发环境,先来个最拿手的点灯。

程序代码:
  1. void delay(unsigned int x)
  2. {
  3.         unsigned int i=0,j=0;
  4.         for( ;j<x;j++)
  5.         for(i=0;i<200;i++);
  6. }
  1. void main(void)
  2. {
  3.     uint16 PowerUpCnt = 0;
  4.     uint16 i=0;
  5.                 float adc7=0.0;
  6.     /*********上电等待*********/
  7.     for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
  8.     SetBit(P4_OE,P44);//设置GPIO44输出使能
  9.                 SetBit(P4_PU,P44);//设置上拉
  10.                 GP44=0;//GPIO44写0
  11.                 UART1_Init();
  12.     while (1)
  13.     {
  14.                         GP44=!GP44;
  15.                         delay(5000);
  16.     }
  17. }
实验效果:

led 00_00_00-00_00_30.gif

接下来就是最常用也最方便的串口了,官方已经给好了初始化代码,但是这里还是将putchar()函数重写一下,方便使用printf()格式化串口输出
  1. void UART1_Init(void)
  2. {
  3.     SetBit(PH_SEL, UART1EN);    //P0[6]as UART2_RXD; P0[5]as UART2_TXD
  4.     #if 0
  5.     ClrBit(P0_OE, P06);         //输入使能
  6.     SetBit(P0_PU, P06);         //上拉电阻
  7.     SetBit(P0_OE, P05);         //输出使能
  8.     SetBit(P0_PU, P05);         //上拉电阻
  9.     #endif
  10.     UT_MOD1 = 0;    //00-->单线制8bit        01-->8bit uart(波特率可设置)
  11.     UT_MOD0 = 1;    //10-->单线制9bit        11-->9bit uart(波特率可设置)
  12.     SM2 = 0;        //0-->单机通讯          1-->多机通讯;
  13.     REN = 1;        //0-->不允许串行输入 1-->允许串行输入,软件清0;
  14.     TB8 = 0;        //模式2/3下数据发送第9位,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址
  15.     RB8 = 0;        //模式2/3下数据接收第9位,若SM2=0,作为停止位
  16.     PI2C_UT11 = 0;                 //中断优先级时最低
  17.     PI2C_UT10 = 0;
  18.     ClrBit(UT_BAUD, UART_2xBAUD);   //倍频使能0-->Disable  1-->Enable
  19.     ES0 = 0;                        //UART1中断使能0-->Disable  1-->Enable
  20.     UT_BAUD = 0x000c;//波特率可设置 = 24000000/(16/(1+ UT_BAUD[BAUD_SEL]))/(UT_BAUD+1)
  21.     //9B-->9600 0x000c-->115200
  22. }
  1. char putchar(unsigned char c)
  2. {
  3.     UT_DR = c;
  4.     while (!TI);
  5.     TI=0;
  6.                 return 0;
  7. }
  1. void main(void)
  2. {
  3.     uint16 PowerUpCnt = 0;
  4.     uint16 i=0;
  5.                 float adc7=0.0;
  6.     /*********上电等待*********/
  7.     for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
  8.     SetBit(P4_OE,P44);//设置GPIO44输出使能
  9.                 SetBit(P4_PU,P44);//设置上拉
  10.                 GP44=0;//GPIO44写0
  11.                 UART1_Init();
  12.     while (1)
  13.     {
  14.                         GP44=!GP44;
  15.                         delay(5000);
  16.                         printf("%d.Uart1 Test!\r\n", ++i);
  17.     }
  18. }
演示效果:

图片6.png

主板上还有一个滑动变阻器,接在P34上,这个滑动变阻器官方是用来模拟调速的,现在先简单测试一下

图片7.png


图片8.png

通过数据手册知道FU6832L芯片内部的ADC是12位的,那么读出ADC转换结果乘以参考电压再除4095就可以得到电压值了。而通道7的转换结果存放在16位寄存器ADC7_DR中,
故计算公式:
  1. adc7=(ADC7_DR>>3)*5.0/4095;
左移3位是因为对齐方式位左次高对齐,也可以设置右对齐,就不用移位了,

图片10.png

主要代码:
  1. void main(void)
  2. {
  3.     uint16 PowerUpCnt = 0;
  4.     uint16 i=0;
  5.                 float adc7=0.0;
  6.     /*********上电等待*********/
  7.     for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
  8.     SetBit(P4_OE,P44);//设置GPIO44输出使能
  9.                 SetBit(P4_PU,P44);//设置上拉
  10.                 GP44=0;//GPIO44写0
  11.                 UART1_Init();
  12.         VREFConfigInit();//设置参考电压 5V
  13.                 SetBit(P3_AN , PIN4);   //设置P34为模拟输入
  14.                 SetBit(ADC_MASK,CH7EN);    //通道使能
  15.                 SetBit(ADC_CR, ADCALIGN);       //ADC数据次高位对齐使能0-->Disable 1-->Enable
  16.                 SetBit(ADC_CR, ADCEN);          //使能 ADC0
  17.     while (1)
  18.     {
  19.                         GP44=!GP44;
  20.                         delay(5000);
  21.                         SetBit(ADC_CR,ADCBSY);//启动ADC
  22.                 while(ReadBit(ADC_CR,ADCBSY));//等待ADC转换完成
  23.                 adc7=(ADC7_DR>>3)*5.0/4095;
  24.                         printf("%d.滑动变阻器电压:%.2f V\r\n", ++i, adc7);
  25.     }
  26. <div>
用手旋转滑动变阻器得到如下结果:

图片12.png

接下来再来个定时器,有了定时器,不管做什么都是很方便的啦。查阅数据手册知道Timer1 包含一个 16 位向上计数的基本定时器和一个 16 位向上计数的重载定时器,两个定时器的计数源均为内部时钟。而且可以产生溢出中断。当然还有一个滴答定时器,但是已经被当作系统总中断用了,那为了后续使用,这里就用TIM1。

图片13.png
图片14.png

其他定时器主要用作PWM输出或脉冲输入检测,故这里选用TIM1。

注释我写的比较详细,就直接上代码了
  1. void Timer1_Init(void)
  2. {
  3. SetBit(TIM1_CR3,T1PSC2);
  4. SetBit(TIM1_CR3,T1PSC1);
  5. SetBit(TIM1_CR3,T1PSC0);//配置TIM1时钟分频,111->187.5K
  6. SetBit(TIM1_IER,T1MAME|T1BOIE);//T1MAME使能后,基本定时器和重载定时器作为独立的定时器。具体细节为:
  7. //基本定时器的BCNTR不再由T1BRS控制清零,由BCNTR上溢事件清 零;
  8. //T1BOIE基本定时器上溢中断使能
  9. ClrBit(TIM1_SR,T1BOIE);//清除中断标志
  10. TIM1__BCNTR=0;//基本定时器计数值
  11. TIM1__BARR=18750;//基本定时器自动重载值 100ms一次中断
  12. SetBit(TIM1_CR0,T1BCEN);//基本定时器计数器使能
  13. }
  1. volatile unsigned long total_time=0;
  2. void main(void)
  3. {
  4.     uint16 PowerUpCnt = 0;
  5.     uint16 i=0;
  6. float adc7=0.0;
  7.     /*********上电等待*********/
  8.     for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
  9.     SetBit(P4_OE,P44);//设置GPIO44输出使能
  10. SetBit(P4_PU,P44);//设置上拉
  11. GP44=0;//GPIO44写0
  12. UART1_Init();
  13. Timer1_Init();
  14. EA=1;
  15.     while (1)
  16.     {
  17. delay(5000);
  18.     }
  19. }
  1. void TIM1_INT() interrupt 5
  2. {
  3. static uint16 i=0;
  4. if(++i==10)
  5. {
  6. i=0;
  7. GP44=!GP44;//一秒钟翻转一次
  8. total_time++;//一秒钟自增一次
  9. printf("已开机:%ld 秒\r\n", total_time);
  10. }
  11. ClrBit(TIM1_SR,T1BOIE);//清除中断标志
  12. }
效果如下:
timer 00_00_00-00_00_30.gif

其它通用外设比如IIC,大部分都是用模拟的,这里我就不测试了,还有SPI也不大方便测。

但是这款单片机内部还集成了运算放大器,比较器,FOC相关专用寄存器,这些官方给的例程里都用到了,接下来就是官方的无刷电机控制例程了,毕竟这款单片机可以说是专为FOC而生的了。由于我手里只有一个无感无刷电机,就先来一个慢一点的,磕磕绊绊的,应该是电机参数没测好

电机慢 00_00_00-00_00_30.gif

再来个中速的

电机 00_00_00-00_00_30~1.gif

最后是暴力旋转。

电机快 00_00_00-00_00_30.gif

(本来在word写的,视频都是MP4,听声音可以听出快慢的,但是上传发现只能GIF,就没声音了,大家将就看吧)

好了,这次测评就到此结束了,等有了有感无刷,再来玩玩这块板子,应该会更好玩。