论坛» 嵌入式开发» MCU

追风剑,全国智能车竞赛MCU,STC32F12K64,64MHz,硬件浮点,实验板程序,FOC方案征集

助工
2023-06-13 10:29 1楼

STC32F12K54-64MHz追风剑核心功能实验板,
硬件单精度浮点运算器,演示程序发布更新中

追风剑, 全国智能车竞赛MCU, STC32F12K64,64MHz,硬件浮点,实验板程序, FOC方案征集-1.png(105.59 KB, 下载次数: 0)

下载附件

1 小时前上传


http://www.stcmcudata.com/STC8F-DATASHEET/STC32F12K54.pdf
===最新数据手册是 2023/5/31 发布的初版
更新记录
2023.06.12
1. 增加例程"22-硬件单精度浮点数运算";
2. 增加例程"23-DHT11温湿度数据读取-串口打印";
3. 增加例程"24-STC-ISP调试接口通过UART协议驱动虚拟设备";
4. 增加例程"25-STC-ISP调试接口通过USB CDC协议驱动虚拟设备";
5. 增加例程"26-STC-ISP调试接口通过USB HID协议驱动虚拟设备";
6. 增加例程"27-核心硬件功能初始化例程"。

2023.06.08
1. 初版发布 !

STC32F12K54-LQFP48-DIP48-DEMO-CODE-20230612.zip

助工
2023-06-13 10:30 2楼

征集开源 FOC 电机控制方案@STC32F12K54-64MHz为高校《单片机应用及原理》课程
===硬件材料费www.STCAIMCU.com,辛苦费 RMB5000 !
有强大的专门支持FOC运算硬件单精度浮点运算器,外部加上普通的运放就可以做FOC控制
32位8051世界共同进步,期待大家在此开源 STC32F12K54-64MHz-LQFP48的 FOC 方案

32位8051世界大礼,追风剑-STC32F12K54-64MHz,还是 STC的 那个 8051 回来了 !
少年强则国强,6/1 儿童节 新生代32位8051全面出击,全球 【免费+包邮】 送
硬件单精度浮点运算器/8051世界革命性的进步,64MHz 主频! 强大的DMA支持
===8K 高速 edata/堆栈/RTOS, 4k xdata/DMA缓冲区
288MHzPWM 时钟源,STC32F12K54
===奋起一剑斩不周,扳倒乾坤天且休!
自带硬件 USB 仿真】,【硬件 USB 高速下载】,同时支持【SWD仿真】,【串口仿真】

追风剑-STC32F12K54-64MHz-LQFP48转DIP48核心功能实验板

这个 STC32F12K54 的内部高达 [60MHz-HIRC] 的高速 HIRC, 不好做,
【5.5V ~ 2V 的压飘】,【-40度 ~ +85度的温漂】,对 60MHz的内部 HIRC是一大难题 !
暂时的解决方案就是用外部 32768 RTC 时钟来自动动态追频,动态调教内部高频时钟到 60MHz,
误差在 +/- 0.3%
用内部高速IRC取代外部高频时钟的好处是 【对外电磁辐射小抗干扰强

后记,网友调侃:
平常吹水,自说水平高,现在【没能力开源个8051做的 FOC 方案,帮助大家共同进步 】!
只能说还是要虚心学习,共同进步

助工
2023-06-14 17:17 3楼

250MHz时钟源PWM,STC32F12K54-64MHz
——高速PWM应用1:高速PWM输出
——高速PWM应用2:捕获外部高速脉宽(查询方式)
——高速PWM应用3:捕获外部高速脉宽(中断方式)


高速PWM应用1:高速PWM输出
高速PWM可使用内建500MHz高速HPLL作为时钟源【输出高速PWM】/【捕获外部高速脉宽】
(注:500MHz的HPLL时钟2分频输出50%占空比的PLL输出时钟可作为高速PWM的时钟源)

  1. /************* 功能说明 **************


  2. 时钟说明:由内部IRC产生24MHz的时钟分频为6M提供给HPLL当作HPLL输入时钟,PLL锁频到246MHz输出作为高速PWM的时钟源,


  3. PWM高速输出说明:PWMA的CC1通道配置为输出模式,并从P1.0/P1.1口输出频率为2.46MHz,占空比为50%的互补对称带死区的PWM波形


  4. 下载时, 选择默认IRC时钟 24MHz。


  5. ******************************************/


  6. #include "stc32g.h"


  7. #define FOSC 24000000UL


  8. #define HSCK_MCLK 0

  9. #define HSCK_PLL 1

  10. #define HSCK_SEL HSCK_PLL


  11. #define HSIOCK 0x40


  12. #define ENHPLL 0x80

  13. #define HPLLDIV_52 0x00

  14. #define HPLLDIV_54 0x01

  15. #define HPLLDIV_56 0x02

  16. #define HPLLDIV_58 0x03

  17. #define HPLLDIV_60 0x04

  18. #define HPLLDIV_62 0x05

  19. #define HPLLDIV_64 0x06

  20. #define HPLLDIV_66 0x07

  21. #define HPLLDIV_68 0x08

  22. #define HPLLDIV_70 0x09

  23. #define HPLLDIV_72 0x0A

  24. #define HPLLDIV_74 0x0B

  25. #define HPLLDIV_76 0x0C

  26. #define HPLLDIV_78 0x0D

  27. #define HPLLDIV_80 0x0E

  28. #define HPLLDIV_82 0x0F


  29. #define ENCKM 0x80

  30. #define PCKI_MSK 0x60

  31. #define PCKI_D1 0x00

  32. #define PCKI_D2 0x20

  33. #define PCKI_D4 0x40

  34. #define PCKI_D8 0x60


  35. void delay()

  36. {

  37. int i;


  38. for (i=0; i<100; i++);

  39. }


  40. char ReadPWMA(char addr)

  41. {

  42. char dat;


  43. while (HSPWMA_ADR & 0x80); //等待前一个异步读写完成

  44. HSPWMA_ADR = addr | 0x80; //设置间接访问地址,只需要设置原XFR地址的低7位

  45. //HSPWMA_ADDR寄存器的最高位写1,表示读数据

  46. while (HSPWMA_ADR & 0x80); //等待当前异步读取完成

  47. dat = HSPWMA_DAT; //读取异步数据


  48. return dat;

  49. }


  50. void WritePWMA(char addr, char dat)

  51. {

  52. while (HSPWMA_ADR & 0x80); //等待前一个异步读写完成

  53. HSPWMA_DAT = dat; //准备需要写入的数据

  54. HSPWMA_ADR = addr & 0x7f; //设置间接访问地址,只需要设置原XFR地址的低7位

  55. //HSPWMA_ADDR寄存器的最高位写0,表示写数据

  56. }


  57. int main()

  58. {

  59. EAXFR = 1;


  60. P0M0 = 0; P0M1 = 0;

  61. P1M0 = 0; P1M1 = 0;

  62. P2M0 = 0; P2M1 = 0;

  63. P3M0 = 0; P3M1 = 0;

  64. P4M0 = 0; P4M1 = 0;

  65. P5M0 = 0; P5M1 = 0;


  66. //选择HPLL输入时钟分频,保证输入时钟为6M

  67. USBCLK &= ~PCKI_MSK;

  68. #if (FOSC == 6000000UL)

  69. USBCLK |= PCKI_D1; //PLL输入时钟1分频

  70. #elif (FOSC == 12000000UL)

  71. USBCLK |= PCKI_D2; //PLL输入时钟2分频

  72. #elif (FOSC == 24000000UL)

  73. USBCLK |= PCKI_D4; //PLL输入时钟4分频

  74. #elif (FOSC == 48000000UL)

  75. USBCLK |= PCKI_D8; //PLL输入时钟8分频

  76. #else

  77. USBCLK |= PCKI_D4; //默认PLL输入时钟4分频

  78. #endif


  79. //设置HPLL的除频系数

  80. // HPLLCR = HPLLDIV_52; //F_HPLL=6M*52/2=156M

  81. // HPLLCR = HPLLDIV_54; //F_HPLL=6M*54/2=162M

  82. // HPLLCR = HPLLDIV_56; //F_HPLL=6M*56/2=168M

  83. // HPLLCR = HPLLDIV_58; //F_HPLL=6M*58/2=174M

  84. // HPLLCR = HPLLDIV_60; //F_HPLL=6M*60/2=180M

  85. // HPLLCR = HPLLDIV_62; //F_HPLL=6M*62/2=186M

  86. // HPLLCR = HPLLDIV_64; //F_HPLL=6M*64/2=192M

  87. // HPLLCR = HPLLDIV_66; //F_HPLL=6M*66/2=198M

  88. // HPLLCR = HPLLDIV_68; //F_HPLL=6M*68/2=204M

  89. // HPLLCR = HPLLDIV_70; //F_HPLL=6M*70/2=210M

  90. // HPLLCR = HPLLDIV_72; //F_HPLL=6M*72/2=216M

  91. // HPLLCR = HPLLDIV_74; //F_HPLL=6M*74/2=222M

  92. // HPLLCR = HPLLDIV_76; //F_HPLL=6M*76/2=228M

  93. // HPLLCR = HPLLDIV_78; //F_HPLL=6M*78/2=234M

  94. // HPLLCR = HPLLDIV_80; //F_HPLL=6M*80/2=240M

  95. HPLLCR = HPLLDIV_82; //F_HPLL=6M*82/2=246M


  96. //启动HPLL

  97. HPLLCR |= ENHPLL; //使能HPLL


  98. delay(); //等待HPLL时钟稳定


  99. //选择HSPWM/HSSPI时钟

  100. #if (HSCK_SEL == HSCK_MCLK)

  101. CLKSEL &= ~HSIOCK; //HSPWM/HSSPI选择主时钟为时钟源

  102. #elif (HSCK_SEL == HSCK_PLL)

  103. CLKSEL |= HSIOCK; //HSPWM/HSSPI选择PLL输出时钟为时钟源

  104. #else

  105. CLKSEL &= ~HSIOCK; //默认HSPWM/HSSPI选择主时钟为时钟源

  106. #endif


  107. HSCLKDIV = 0; //HSPWM/HSSPI时钟源不分频


  108. HSPWMA_CFG = 0x03; //使能PWMA相关寄存器异步访问功能


  109. PWMA_PS = 0x00; //PWMA_CC1/CC1N高速PWM输出到CC1/CC1N口

  110. //注意:PWMA_PS属于I/O控制寄存器,不能使用异步方式进行读写


  111. //通过异步方式设置PWMA的相关寄存器

  112. WritePWMA((char)&PWMA_CCER1, 0x00);

  113. WritePWMA((char)&PWMA_CCMR1, 0x00); //CC1为输出模式

  114. WritePWMA((char)&PWMA_CCMR1, 0x60); //OC1REF输出PWM1(CNT

  115. WritePWMA((char)&PWMA_CCER1, 0x05); //使能CC1/CC1N上的输出功能

  116. WritePWMA((char)&PWMA_ENO, 0x03); //使能PWM信号输出到端口P1.0/P1.1

  117. WritePWMA((char)&PWMA_BKR, 0x80); //使能主输出

  118. WritePWMA((char)&PWMA_CCR1H, 0); //设置PWM占空比为50个PWM时钟

  119. WritePWMA((char)&PWMA_CCR1L, 50);

  120. WritePWMA((char)&PWMA_ARRH, 0); //设置输出PWM的周期为100个PWM时钟

  121. WritePWMA((char)&PWMA_ARRL, 99);

  122. WritePWMA((char)&PWMA_DTR, 10); //设置互补对称输出PWM的死区

  123. WritePWMA((char)&PWMA_CR1, 0x01); //开始PWM计数


  124. // P2 = ReadPWMA((char)&PWMA_ARRH); //异步方式读取寄存器

  125. // P0 = ReadPWMA((char)&PWMA_ARRL);


  126. while (1);

  127. }

PWM使用HPLL时钟(输出高速PWM).zip

共3条 1/1 1 跳转至

回复

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