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

图片1.png

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

程序代码:
void delay(unsigned int x)
  • {
  •         unsigned int i=0,j=0;
  •         for( ;j<x;j++)
  •         for(i=0;i<200;i++);
  • }
  • 复制代码
    void main(void)
  • {
  •     uint16 PowerUpCnt = 0;
  •     uint16 i=0;
  •                 float adc7=0.0;
  •     /*********上电等待*********/
  •     for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
  •     SetBit(P4_OE,P44);//设置GPIO44输出使能
  •                 SetBit(P4_PU,P44);//设置上拉
  •                 GP44=0;//GPIO44写0
  •                 UART1_Init();
  •     while (1)
  •     {
  •                         GP44=!GP44;
  •                         delay(5000);
  •     }
  • }
  • 复制代码
    实验效果:

    led 00_00_00-00_00_30.gif

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

    图片6.png

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

    图片7.png


    图片8.png

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

    图片10.png

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

    图片12.png

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

    图片13.png
    图片14.png

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

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

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