标题:
全国电赛电源类题目stm32驱动 附源程序
[打印本页]
作者:
2424942317
时间:
2017-5-18 20:47
标题:
全国电赛电源类题目stm32驱动 附源程序
国赛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
(67.66 KB, 下载次数: 75)
下载附件
2017-5-18 21:28 上传
stm32单片机源程序如下:
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "math.h"
#include "AD&DA.h"
#include "Tim.h"
/***************Write By XHJ******************/
u16 AD_Buffer_Rx[8];
__IO uint64_t IC2Value = 0;
__IO uint64_t DutyCycle = 0;
__IO uint64_t Frequency = 0;
__IO uint64_t IC1Value = 0;
__IO uint64_t DutyCycle1 = 0;
__IO uint64_t Frequency1 = 0;
uint64_t capture_Times,A,SHI,GE;
uint64_t total_Time,total_Time1;
uint64_t low_Time,low_Time1;
u32 SIN_LUT_index = 0;
u32 Cnt_Dir = 0;
double Sin_Lut[360]= {0};
double Sin_Lut2[360]= {0};
double Sin_Lut3[360]= {0};
u8 LowRangeFlag= 0;
u8 HighRangeFlag= 0;
u16 SetUpPara= 1;
u16 amp = 1000;
u16 fqc = 5; //fqc为正弦调幅波频率的1/10,单位Hz。
u16 fz = 15; //fz为载波频率,单位kHz。
u16 fe=10,flag=0,psc;
u16 count=0; //计数值
uint8_t TxBuffer1[] = "USART Interrupt Example: This is USART1 DEMO";
uint8_t RxBuffer1[],rec_f,tx_flag,RxCounter1;
#define PWMSetUpMax 2000
/***********初始化生成sin数组****************/
void SPWM_Init( void )
{
u16 i;
for( i=0; i<360; i++) //A
{
Sin_Lut[i] = 100*cos(2*3.1415926*i/360.0);
}
for( i=0; i<360; i++) //B
{
Sin_Lut2[i] = 100*cos(2*3.1415926*(i-120)/360.0);
}
for( i=0; i<360; i++) //C
{
Sin_Lut3[i] = 100*cos(2*3.1415926*(i+120)/360.0);
}
}
int main(void)
{
int i=1000;
delay_init(); //延时函数初始化
SPI1_Init(); //LCD SPI1初始化(包含各种时钟初始化)
//uart3_init(9600); //串口初始化为9600
LCD_MyInit(); //LCD 初始化
SPI_Configuration(); //AD DA配置初始化 SPI2和GPIO
POINT_COLOR=RED;//设置字体为红色
BACK_COLOR=WHITE;//背景白色
DAC7565_Init(); //DA初始化
//SPWM_Init( ); //sin数组初始化
//TIM_Configuration(); //定时器及中断向量配置
//TIM_Cmd(TIM1,ENABLE); //打开定时器1
/* TIM1 Main Output Enable */
//TIM_CtrlPWMOutputs(TIM1, ENABLE);
//TIM_Cmd(TIM2,ENABLE); //打开定时器2
//TIM_Cmd(TIM3,ENABLE); //打开定时器3
//TIM_Cmd(TIM4,ENABLE); //打开定时器4
//设定AD值
Set_DAValue(0,4000);
Set_DAValue(1,3062);
Set_DAValue(2,2048);
Set_DAValue(3,1024);
while(1)
{
i++;
AD_Convert(); //AD轉換
LCD_ShowNum(0,0,AD_Buffer_Rx[0],5,16); //显示AD值
LCD_ShowNum(0,100,AD_Buffer_Rx[1],5,16);
LCD_ShowNum(0,200,AD_Buffer_Rx[2],5,16);
LCD_ShowNum(0,300,AD_Buffer_Rx[3],5,16);
delay_ms(500);
Set_DAValue(0,2000);
// psc=648648/fe;
// TIM1->PSC=psc; //预分频设置
// if(flag==0)
// {
// fe+=10;
// if(fe>=30000){flag=1;}
// }
// if(flag==1)
// {
// fe-=10;
// if(fe<=10){flag=0;}
// }
// count=TIM2->CNT;
}
}
/***********T2中断处理SPWM***********/
void TIM2_IRQHandler(void)
{
TIM_Cmd(TIM1,DISABLE); //关闭定时器1
// if( SIN_LUT_index == 360 )
// {
// SIN_LUT_index= 0;
// }
// TIM1->CCR1 = (u16)((18000/fz)-amp*Sin_Lut[SIN_LUT_index]*SetUpPara/PWMSetUpMax/1000.0);
// TIM1->CCR2 = (u16)((18000/fz)-amp*Sin_Lut2[SIN_LUT_index]*SetUpPara/PWMSetUpMax/1000.0);
// TIM1->CCR3 = (u16)((18000/fz)-amp*Sin_Lut3[SIN_LUT_index]*SetUpPara/PWMSetUpMax/1000.0);
// SIN_LUT_index++;
// if( SetUpPara < PWMSetUpMax )
// {
// SetUpPara++;
// }
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //中断标志位清零
}
/***********T3中断处理***********/
void TIM3_IRQHandler(void)
{
if(flag==0)
{
fe+=10;
if(fe>=20000){flag=1;}
}
if(flag==1)
{
fe-=10;
if(fe<=10){flag=0;}
}
psc=654545/fe;
TIM1->PSC=psc; //预分频设置
TIM_ClearFlag(TIM3,TIM_FLAG_Update); //中断标志位清零
}
/***********T4输入捕获***********/
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
{
/* Clear TIM8 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM4, TIM_IT_CC2);
/* Get the Input Capture value */
IC2Value =TIM_GetCapture2(TIM4);
if (IC2Value != 0)
{
/* Duty cycle computation */
total_Time=IC2Value;
//low_Time=TIM_GetCapture1(TIM4);
//DutyCycle=(low_Time+1)*100/total_Time;
//SHI=DutyCycle;
low_Time=0;
total_Time=0;
/* Frequency computation */
Frequency = SystemCoreClock/IC2Value/720; //72M/(TIM_Prescaler+1)/IC2Value
}
else
{
DutyCycle = 0;
Frequency = 0;
}
}
if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
{
/* Clear TIM8 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
/* Get the Input Capture value */
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
STM32F103SimpleDemo.rar
(389.62 KB, 下载次数: 130)
2017-5-18 20:46 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
陶淘51
时间:
2017-7-20 15:23
写的很好
作者:
691757842
时间:
2017-7-30 22:38
你好。我在论坛看到了你的SPWM程序,我想询问你下,就是我想改成输出频率为50HZ的话,要怎么去改,还有,载波频率的话,要怎么去理解?希望你抽空回复我一下。
作者:
1172025273
时间:
2017-8-6 18:03
谢谢、
作者:
1172025273
时间:
2017-8-6 18:04
写的很好、
作者:
123456WH
时间:
2017-8-6 21:06
很想要,可是金币不够
作者:
tianguibin
时间:
2018-10-29 15:49
非常实用
作者:
tianguibin
时间:
2018-12-6 15:07
楼主能上传一波硬件图么,DAC7565转换输出没反应,跪求
作者:
aaaaaa。
时间:
2019-5-18 11:36
这是哪年的国赛题
作者:
liumingyue
时间:
2019-6-15 22:14
DAC7565的程序能上传CSDN一份吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1