开箱后,开发套件主要是两个,下图一块主板,一个下载器。
板子到手,照着官网资料搭建好开发环境,先来个最拿手的点灯。
程序代码:
- 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);
- }
- }
实验效果:
接下来就是最常用也最方便的串口了,官方已经给好了初始化代码,但是这里还是将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);
- }
- }
演示效果:
主板上还有一个滑动变阻器,接在P34上,这个滑动变阻器官方是用来模拟调速的,现在先简单测试一下
通过数据手册知道FU6832L芯片内部的ADC是12位的,那么读出ADC转换结果乘以参考电压再除4095就可以得到电压值了。而通道7的转换结果存放在16位寄存器ADC7_DR中,
故计算公式:
- adc7=(ADC7_DR>>3)*5.0/4095;
左移3位是因为对齐方式位左次高对齐,也可以设置右对齐,就不用移位了,
主要代码:
- 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>
用手旋转滑动变阻器得到如下结果:
接下来再来个定时器,有了定时器,不管做什么都是很方便的啦。查阅数据手册知道Timer1 包含一个 16 位向上计数的基本定时器和一个 16 位向上计数的重载定时器,两个定时器的计数源均为内部时钟。而且可以产生溢出中断。当然还有一个滴答定时器,但是已经被当作系统总中断用了,那为了后续使用,这里就用TIM1。
其他定时器主要用作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);//清除中断标志
- }
效果如下:
其它通用外设比如IIC,大部分都是用模拟的,这里我就不测试了,还有SPI也不大方便测。
但是这款单片机内部还集成了运算放大器,比较器,FOC相关专用寄存器,这些官方给的例程里都用到了,接下来就是官方的无刷电机控制例程了,毕竟这款单片机可以说是专为FOC而生的了。由于我手里只有一个无感无刷电机,就先来一个慢一点的,磕磕绊绊的,应该是电机参数没测好
再来个中速的
最后是暴力旋转。
(本来在word写的,视频都是MP4,听声音可以听出快慢的,但是上传发现只能GIF,就没声音了,大家将就看吧)
好了,这次测评就到此结束了,等有了有感无刷,再来玩玩这块板子,应该会更好玩。