比特138

 找回密码
 立即注册
搜索
查看: 50|回复: 0

Proteus仿真STM32407ZGT6 PWM多路可变频率可调占空比输出

[复制链接]

485

主题

485

帖子

104

积分

初级会员

Rank: 2

金币
104
发表于 2020-5-24 03:02:40 | 显示全部楼层 |阅读模式
一,打开文件(可以随文下载放置在文档中打开)。(如下图1所示)
202336sadk43uap9ear9a9.png
图1
二,调整虚拟器件,另存工程文件。(如下图2,3,4所示)
202336vmggpw0p30e7gmgt.png

  
图2
202336kggj8vv8zj8yj5t5.png
图3
202337f63u691otzm6b4z6.png
  
图4
三,点击Source Code标签。(如下图5所示)
202337eshvh3zn6zni3n9e.png
图5
四,编辑main.c,timer.c,timer.h, key.c,key.h, led.c,led.h 代码如Proteus8.9 仿真STM32407ZGT6系列001(如下图6所示)
202337e6sikzkyfs706hhy.png
图6
五,Main.c 代码:
  1. /* Main.c file  generated by New Project wizard
  2.   
  3. * Author:   Ziegler Yin
  4.   
  5. *  Created:   周四 一月 16 2020
  6.   
  7. *  Processor: STM32F407ZGT6ZGT6
  8.   
  9. *  Compiler:  GCC for ARM
  10.   
  11. */
  12.   
  13.   
  14. #include  "mfuncs.h"
  15.   
  16. #include  "delay.h"
  17.   
  18. #include  "usart.h"
  19.   
  20. #include  "led.h"
  21.   
  22. #include  "key.h"
  23.   
  24. #include  "timer.h"
  25.   
  26.   
  27. #define RT(A ,  B) (A> 300)?  (B= 0):  (B=1)
  28.   
  29.   
  30. uint32_t  gt_fig(u8 sts){
  31.   
  32.       if(1== sts) return  TIM_GetCapture1(TIM4);
  33.   
  34.       if(2== sts) return TIM_GetCapture2(TIM4);
  35.   
  36.       if(3== sts) return  TIM_GetCapture3(TIM4);
  37.   
  38.       if(4== sts) return  TIM_GetCapture4(TIM4);
  39.   
  40. }
  41.   
  42.   
  43. void st_fig(u8  sts, uint32_t gt){
  44.   
  45.       if(1== sts) TIM_SetCompare1(TIM4, gt);
  46.   
  47.       if(2== sts) TIM_SetCompare2(TIM4, gt);
  48.   
  49.       if(3== sts) TIM_SetCompare3(TIM4, gt);
  50.   
  51.       if(4== sts) TIM_SetCompare4(TIM4, gt);
  52.   
  53. }
  54.   
  55.   
  56. void  new_Pwm(u16 *tmbuf, u16 * mdc) {
  57.   
  58.       Pwm_Init(*(tmbuf+0), *(tmbuf+1));
  59.   
  60.       TIM_SetCompare1(TIM4, mdc[0]);
  61.   
  62.       TIM_SetCompare2(TIM4, mdc[1]);
  63.   
  64.       TIM_SetCompare3(TIM4, mdc[2]);
  65.   
  66.   
  67.       Pwm_Init3(*(tmbuf+2), *(tmbuf+3));
  68.   
  69.       TIM_SetCompare2(TIM3, mdc[1]);
  70.   
  71. }
  72.   
  73.   
  74. int main(void)
  75.   
  76. {
  77.   
  78.       u16 psc=840, per=600, idc[4]= {500, 200,  300, 400};
  79.   
  80.       u16 umd, pwmval=0, tm43[2][2]= {840,  600, 1680, 1200};   
  81.   
  82.       u8 status= 0, dir= 1, chgFry[1]= {0, 0};
  83.   
  84.       int gtln= 0;
  85.   
  86.       char *wd, *wds, *lnslt[7]={"未选", "A线路", "B线路", "C线路", "D线路", "变频1-A,B,C倍频或初始状态", "变频2-D四倍频或初始状态"};
  87.   
  88.       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  89.   
  90.       delay_init(168);  //初始化延时函数
  91.   
  92.       uart_init(9600);//初始化串口波特率为115200
  93.   
  94.      LED_Init();
  95.   
  96.      KEY_Init();
  97.   
  98.       uprint("大家好!!!\r\n");
  99.   
  100.       uprint("大家来造呼吸机-----。\r\n");
  101.   
  102.                  gtln= nmtoa(wd, 10, psc);
  103.   
  104.                  uprint(wd);  uprint("\r\n");
  105.   
  106.                  gtln= nmtoa(wd, 10,  (psc+10000));
  107.   
  108.                  uprint(wd);  uprint("\r\n");
  109.   
  110.   
  111.       LED0= LED1= LED2= 1;
  112.   
  113.   
  114.       chgFry[0]= 0;   
  115.   
  116.       chgFry[1]= 4;
  117.   
  118.       new_Pwm(tm43, idc);   
  119.   
  120.   
  121.       uprint("控制芯片STM32F407ZGT6_008_PWM仿真开始了。\r\n");
  122.   
  123.      delay_ms(100);   
  124.   
  125.   
  126.     while(1)
  127.   
  128.       {
  129.   
  130.           wd= lnslt[status]; ;
  131.   
  132.            uprint("Arm运行时......占空比:\r\n");  
  133.   
  134.            uprint(wd);
  135.   
  136.            uprint("线路可调整状态:\r\n");
  137.   
  138.            if(1==ReadKey(GPIOC, 0x0080)) {
  139.   
  140.                  status++;  
  141.   
  142.              delay_ms(20);
  143.   
  144.                  if(status> 6) status= 0;
  145.   
  146.                  wd= lnslt[status]; ;
  147.   
  148.                  uprint("线路调整状态......占空比");  
  149.   
  150.                  uprint(wd);
  151.   
  152.                  uprint("线路可调整状态:\r\n");
  153.   
  154.            }
  155.   
  156.            if(1==ReadKey(GPIOC, 0x0010)) {
  157.   
  158.                  LED0= 1;   
  159.   
  160.                  pwmval= gt_fig(status);
  161.   
  162.                  gtln= nmtoa(wds, 10, pwmval);
  163.   
  164.                  if(status>0){
  165.   
  166.                        if(per< (pwmval+ 50)) {                           
  167.   
  168.                                   uprint("线路调整, 占空值到达最高值  ......\r\n");
  169.   
  170.                                   st_fig(status,  (per+ 1));
  171.   
  172.                       }
  173.   
  174.                       else{
  175.   
  176.                             LED0= 1;
  177.   
  178.                             pwmval=  gt_fig(status);
  179.   
  180.                             gtln= nmtoa(wds,  10, pwmval);
  181.   
  182.                             umd= pwmval +50;
  183.   
  184.                             uprint("线路调整, 占空值由  ");
  185.   
  186.                             uprint(wds);
  187.   
  188.                             uprint(" 增加50 至");
  189.   
  190.                             uprint(numtoa(10,  umd));
  191.   
  192.                             uprint("  ...\r\n ");
  193.   
  194.                             st_fig(status,  umd);
  195.   
  196.                       }
  197.   
  198.                  }
  199.   
  200.            }
  201.   
  202.            if(1==ReadKey(GPIOC, 0x0020)) {
  203.   
  204.                  LED1= 1;   
  205.   
  206.                  if(status==5) {
  207.   
  208.                       if(chgFry[0]==0) {
  209.   
  210.                             chgFry[0]= 2;
  211.   
  212.                             tm43[0][0]= 1680;
  213.   
  214.                             new_Pwm(tm43,  idc);   
  215.   
  216.                             uprint("线路A,B,C频率调整到倍频...\r\n");
  217.   
  218.                             delay_ms(200);
  219.   
  220.                       }
  221.   
  222.                       else{
  223.   
  224.                             chgFry[0]= 0;
  225.   
  226.                             tm43[0][0]= 840;
  227.   
  228.                             new_Pwm(tm43,  idc);   
  229.   
  230.                             uprint("线路A,B,C频率调整到初始状态...\r\n");
  231.   
  232.                             delay_ms(200);
  233.   
  234.                       }
  235.   
  236.                  }
  237.   
  238.                  if(status==6) {
  239.   
  240.                       if(chgFry[1]==0) {
  241.   
  242.                             chgFry[1]= 4;
  243.   
  244.                             tm43[1][0]= 1680;  tm43[1][1]= 1200;
  245.   
  246.                             new_Pwm(tm43,  idc);   
  247.   
  248.                             uprint("线路D频率调整到四倍频...\r\n");
  249.   
  250.                             delay_ms(200);
  251.   
  252.                       }
  253.   
  254.                       else{
  255.   
  256.                             chgFry[1]= 0;
  257.   
  258.                             tm43[1][0]= 840;  tm43[1][1]= 600;
  259.   
  260.                             new_Pwm(tm43,  idc);   
  261.   
  262.                             uprint("线路D频率调整到初始状态...\r\n");
  263.   
  264.                             delay_ms(200);
  265.   
  266.                       }
  267.   
  268.                  }
  269.   
  270.               delay_ms(20);
  271.   
  272.                  pwmval= gt_fig(status);
  273.   
  274.                  gtln= nmtoa(wds, 10, pwmval);
  275.   
  276.                  uprint("Arm运行时......占空比");  
  277.   
  278.                  uprint(wd);
  279.   
  280.                  uprint("线路调整, 由  ");
  281.   
  282.                  uprint(wds);
  283.   
  284.                  uprint(" 清零 ");
  285.   
  286.                  uprint(" ...\r\n  ");
  287.   
  288.                  st_fig(status, 0);
  289.   
  290.            }
  291.   
  292.            if(1==ReadKey(GPIOC, 0x0040)) {
  293.   
  294.                  LED2= 1;
  295.   
  296.                  pwmval= gt_fig(status);
  297.   
  298.                  gtln= nmtoa(wds, 10, pwmval);
  299.   
  300.                  if(pwmval> 50) {
  301.   
  302.                  umd= pwmval -50;
  303.   
  304.                  uprint("线路调整, 占空值由  ");
  305.   
  306.                  uprint(wds);
  307.   
  308.                  uprint(" 减少50 至  ");
  309.   
  310.                  uprint(numtoa(10,  umd));
  311.   
  312.                  uprint(" ...\r\n  ");
  313.   
  314.                  st_fig(status, umd);
  315.   
  316.                  }
  317.   
  318.                  else {
  319.   
  320.                       umd= 1;
  321.   
  322.                       uprint("线路调整, 占空值到达最低值  ......\r\n");
  323.   
  324.                       st_fig(status, 1);
  325.   
  326.                  }
  327.   
  328.            }
  329.   
  330.            LED0= LED1= LED2= 0;
  331.   
  332.           delay_ms(100);  
  333.   
  334.       }
  335.   
  336. }
复制代码
key.c,key.h,  led.c led.h,time.c,time.h之前的代码都可借鉴,不在多列,以后不再一一罗列,只列main.c 与相关功能的.c, .h代码。
   
六,点击构建工程按钮,编译工程。(如下图7所示)
202338lakfu7aamef7kra0.png
图7
   
七,点击窗口左下方仿真按钮,可见红,黄,绿灯点亮后一会灭,仿真开始,按下SELECT按钮,选择"变频1-A,B,C倍频或初始状态", "变频2-D四倍频或初始状态",按下按下KEY_ZERO按钮,倍频, 四倍频或初始状态。占空比的调试,参见:博主的Proteus8.9 仿真STM32407ZGT6系列009_PWM多路可调占空比输出文。虚拟串口,示波器将的状态变化显示在屏。 (如下图8,9,10,11所示)

202338qu4ocq717c1qqqeq.png

图8
  
202339vkzbclcak2kflo22.png

  
图9
202340ygsis1h26db6hgyb.png

  
图10
202340t11uo0lckkhi4l16.png
  
图11
八,选择release,点击构建工程按钮,编译工程生成Hex文件。(如下图12所示)
202341ouedrcqr105pz3ux.png
图12
  
九, 系列的001-003虚拟仿真与开发板对应已证明:虚拟仿真程序对于开发板有效,之后不再➕上下载到开发板的介绍。
   
附件在已安装Proteus8.9的计算机文件夹中打开即可
PWM多路可变频率可调占空比输出仿真文件.rar (366.48 KB, 售价: 1 金币)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|比特138 |网站地图

GMT+8, 2020-9-26 05:53 , Processed in 0.038050 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表