找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9510|回复: 9
收起左侧

全国电赛电源类题目stm32驱动 附源程序

  [复制链接]
ID:202331 发表于 2017-5-18 20:47 | 显示全部楼层 |阅读模式
国赛stm32电源类题目的解答,下面是程序源码的介绍:
1.STM32的主频为72M 在定时器中计算定时时长要用到 72M/((分频+1)*(自动重装载+1))
2.IO口的工作方式主要是推挽输出(没有特殊要求时)  浮空输入(外部中断,计数器等)  复用(如定时器输出pwm)  
3.SPI串行通信时注意空闲时电平高低和在哪点触发,SDO脚是GPIO_Mode_IPU好像浮空也行,可以尝试下  如果要在程序中修改SPI的触发
方式等  要先cmd  disable  然后再修改CR1寄存器的值  
4.AD和DA的供电是5V  要外接电源  USB供电只有3.3
5.显示尽量放优先级最低的中断,中断处理注意清除标志位
6.能不用delay就不要用,它会占用CPU做无用功
7.本例程中的各种变量未明确说明自己看程序研究,还有触摸只是玩玩的,要做触摸控制自己研究,另外外部中断该程序中未加,
根据需要自己加进去,注意包含IO口,EXIT和NVIC及中断处理
8.程序中很多功能注释掉了,自己取消注释看着用

    Write  By  XHJ
0.png

stm32单片机源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "lcd.h"
  4. #include "usart.h"          
  5. #include "math.h"
  6. #include "AD&DA.h"
  7. #include  "Tim.h"
  8. /***************Write By XHJ******************/
  9. u16 AD_Buffer_Rx[8];
  10. __IO uint64_t IC2Value = 0;
  11. __IO uint64_t DutyCycle = 0;
  12. __IO uint64_t Frequency = 0;
  13. __IO uint64_t IC1Value = 0;
  14. __IO uint64_t DutyCycle1 = 0;
  15. __IO uint64_t Frequency1 = 0;

  16. uint64_t capture_Times,A,SHI,GE;
  17. uint64_t total_Time,total_Time1;
  18. uint64_t low_Time,low_Time1;
  19. u32 SIN_LUT_index = 0;
  20. u32 Cnt_Dir = 0;
  21. double Sin_Lut[360]= {0};
  22. double Sin_Lut2[360]= {0};
  23. double Sin_Lut3[360]= {0};
  24. u8 LowRangeFlag= 0;
  25. u8 HighRangeFlag= 0;
  26. u16 SetUpPara= 1;
  27. u16 amp = 1000;
  28. u16 fqc = 5;                //fqc为正弦调幅波频率的1/10,单位Hz。
  29. u16 fz = 15;                //fz为载波频率,单位kHz。
  30. u16 fe=10,flag=0,psc;
  31. u16 count=0; //计数值

  32. uint8_t TxBuffer1[] = "USART Interrupt Example: This is USART1 DEMO";  
  33. uint8_t RxBuffer1[],rec_f,tx_flag,RxCounter1;
  34. #define PWMSetUpMax 2000
  35. /***********初始化生成sin数组****************/
  36. void SPWM_Init( void )
  37. {
  38.         u16 i;
  39.         for( i=0; i<360; i++) //A
  40.         {
  41.                 Sin_Lut[i] = 100*cos(2*3.1415926*i/360.0);
  42.         }
  43.         for( i=0; i<360; i++) //B
  44.         {
  45.                 Sin_Lut2[i] = 100*cos(2*3.1415926*(i-120)/360.0);
  46.         }   
  47.         for( i=0; i<360; i++) //C
  48.         {
  49.                 Sin_Lut3[i] = 100*cos(2*3.1415926*(i+120)/360.0);
  50.         }  
  51. }

  52. int main(void)
  53. {         
  54.          int i=1000;
  55.          delay_init();                     //延时函数初始化          
  56.          SPI1_Init();        //LCD SPI1初始化(包含各种时钟初始化)
  57.          //uart3_init(9600);                 //串口初始化为9600
  58.          LCD_MyInit();          //LCD 初始化
  59.          SPI_Configuration();  //AD DA配置初始化 SPI2和GPIO
  60.    POINT_COLOR=RED;//设置字体为红色
  61.          BACK_COLOR=WHITE;//背景白色
  62.          DAC7565_Init();  //DA初始化
  63.          //SPWM_Init( );    //sin数组初始化
  64.          //TIM_Configuration(); //定时器及中断向量配置
  65.          //TIM_Cmd(TIM1,ENABLE);    //打开定时器1
  66.          /* TIM1 Main Output Enable */
  67.    //TIM_CtrlPWMOutputs(TIM1, ENABLE);
  68.          //TIM_Cmd(TIM2,ENABLE);    //打开定时器2
  69.          //TIM_Cmd(TIM3,ENABLE);         //打开定时器3
  70.          //TIM_Cmd(TIM4,ENABLE);         //打开定时器4
  71.          //设定AD值
  72.          Set_DAValue(0,4000);
  73.          Set_DAValue(1,3062);
  74.    Set_DAValue(2,2048);
  75.    Set_DAValue(3,1024);       

  76.         while(1)
  77.         {          
  78.                 i++;
  79.                 AD_Convert();          //AD轉換       
  80.           LCD_ShowNum(0,0,AD_Buffer_Rx[0],5,16);  //显示AD值
  81.           LCD_ShowNum(0,100,AD_Buffer_Rx[1],5,16);
  82.           LCD_ShowNum(0,200,AD_Buffer_Rx[2],5,16);
  83.           LCD_ShowNum(0,300,AD_Buffer_Rx[3],5,16);
  84.                 delay_ms(500);
  85.                 Set_DAValue(0,2000);
  86.                
  87. //                 psc=648648/fe;
  88. //                 TIM1->PSC=psc;           //预分频设置
  89. //                 if(flag==0)
  90. //                  {
  91. //            fe+=10;
  92. //                 if(fe>=30000){flag=1;}       
  93. //                  }
  94. //                  if(flag==1)
  95. //                  {
  96. //            fe-=10;
  97. //                 if(fe<=10){flag=0;}       
  98. //                  }
  99. //                 count=TIM2->CNT;
  100.                

  101.         }
  102. }

  103. /***********T2中断处理SPWM***********/
  104. void TIM2_IRQHandler(void)  
  105. {
  106.           
  107.            TIM_Cmd(TIM1,DISABLE);    //关闭定时器1
  108. //           if( SIN_LUT_index == 360 )
  109. //         {
  110. //           SIN_LUT_index= 0;
  111. //         }

  112. //         TIM1->CCR1 = (u16)((18000/fz)-amp*Sin_Lut[SIN_LUT_index]*SetUpPara/PWMSetUpMax/1000.0);
  113. //         TIM1->CCR2 = (u16)((18000/fz)-amp*Sin_Lut2[SIN_LUT_index]*SetUpPara/PWMSetUpMax/1000.0);
  114. //         TIM1->CCR3 = (u16)((18000/fz)-amp*Sin_Lut3[SIN_LUT_index]*SetUpPara/PWMSetUpMax/1000.0);

  115. //         SIN_LUT_index++;
  116. //         if( SetUpPara < PWMSetUpMax )
  117. //         {
  118. //           SetUpPara++;
  119. //         }
  120.           TIM_ClearFlag(TIM2,TIM_FLAG_Update);        //中断标志位清零
  121. }
  122. /***********T3中断处理***********/
  123. void TIM3_IRQHandler(void)  
  124. {
  125.            if(flag==0)
  126.                 {
  127.           fe+=10;
  128.                 if(fe>=20000){flag=1;}       
  129.                 }
  130.                 if(flag==1)
  131.                 {
  132.           fe-=10;
  133.                 if(fe<=10){flag=0;}       
  134.                 }
  135.                 psc=654545/fe;
  136.                 TIM1->PSC=psc;           //预分频设置
  137.           TIM_ClearFlag(TIM3,TIM_FLAG_Update);        //中断标志位清零
  138. }
  139. /***********T4输入捕获***********/
  140. void TIM4_IRQHandler(void)
  141. {
  142.   if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
  143.         {
  144.                 /* Clear TIM8 Capture compare interrupt pending bit */
  145.                 TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
  146.                
  147.                 /* Get the Input Capture value */
  148.                 IC2Value =TIM_GetCapture2(TIM4);
  149.                
  150.                 if (IC2Value != 0)
  151.                 {
  152.                         /* Duty cycle computation */
  153.                           total_Time=IC2Value;
  154.                           //low_Time=TIM_GetCapture1(TIM4);
  155.                           //DutyCycle=(low_Time+1)*100/total_Time;
  156.                           //SHI=DutyCycle;
  157.                           low_Time=0;
  158.                           total_Time=0;
  159.                     /* Frequency computation */
  160.                     Frequency = SystemCoreClock/IC2Value/720;          //72M/(TIM_Prescaler+1)/IC2Value
  161.                 }
  162.                 else
  163.                 {
  164.                     DutyCycle = 0;
  165.                     Frequency = 0;
  166.                 }
  167.   }       
  168.         if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
  169.         {
  170.                 /* Clear TIM8 Capture compare interrupt pending bit */
  171.                 TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
  172.                
  173.                 /* Get the Input Capture value */
  174. ……………………

  175. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
STM32F103SimpleDemo.rar (389.62 KB, 下载次数: 129)

评分

参与人数 2黑币 +10 收起 理由
1172025273 + 5 赞一个!
墨非鱼 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:94949 发表于 2017-7-20 15:23 | 显示全部楼层
写的很好
回复

使用道具 举报

ID:223441 发表于 2017-7-30 22:38 | 显示全部楼层
你好。我在论坛看到了你的SPWM程序,我想询问你下,就是我想改成输出频率为50HZ的话,要怎么去改,还有,载波频率的话,要怎么去理解?希望你抽空回复我一下。
回复

使用道具 举报

ID:225258 发表于 2017-8-6 18:03 | 显示全部楼层
谢谢、
回复

使用道具 举报

ID:225258 发表于 2017-8-6 18:04 | 显示全部楼层
写的很好、
回复

使用道具 举报

ID:225299 发表于 2017-8-6 21:06 | 显示全部楼层
很想要,可是金币不够
回复

使用道具 举报

ID:417314 发表于 2018-10-29 15:49 | 显示全部楼层
非常实用
回复

使用道具 举报

ID:417314 发表于 2018-12-6 15:07 | 显示全部楼层
楼主能上传一波硬件图么,DAC7565转换输出没反应,跪求
回复

使用道具 举报

ID:511461 发表于 2019-5-18 11:36 | 显示全部楼层
这是哪年的国赛题
回复

使用道具 举报

ID:487825 发表于 2019-6-15 22:14 | 显示全部楼层
DAC7565的程序能上传CSDN一份吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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