stm32中利用CAN对DAC输出电压进行控制(基于keil5软件)
采用库函数对程序进行设计。
程序
#include “system.h”
#include “SysTick.h”
#include “led.h”
#include “usart.h”
#include “key.h”
#include “can.h”
#include “dac.h”
int main()
{
u8 i=0,j=0,n=0;
u8 key;
u8 mode=0;
u8 res;
u8 tbuf[2];
u8 rbuf[2];
u16 char_buf[2];
u16 b=0;
u16 c=0;
u16 dacval;
float dac_vol;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组
LED_Init();
USART1_Init(9600);
KEY_Init();
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_Normal);//500Kbps波特率
DAC1_Init();
while(1)
{
key=KEY_Scan(0);
if(keyKEY_UP) //模式切换
{
mode=!mode;
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);
if(mode0)
{
printf(“Normal Mode\r\n”);
}
else
{
printf(“LoopBack Mode\r\n”);
}
}
if(key==KEY_DOWN)
{
char_buf[0]=tbuf[0]+0x30;
char_buf[1]=tbuf[1]+0x30;
res=CAN_Send_Msg(tbuf,2);
if(res)
{
printf("Send Failed!\r\n");
}
else
{
printf("·发送数据%s\r\n",tbuf);
}
}
res=CAN_Receive_Msg(tbuf);
if(res)
{
c=(tbuf[0]<<8)+tbuf[1];
DAC_SetChannel1Data(DAC_Align_12b_R,c);
printf("接收数据%s\r\n",rbuf);
}
i++;
if(i%20==0)
{
led1=!led1;
dacval=DAC_GetDataOutputValue(DAC_Channel_1);
dac_vol=(float)dacval*(3.3/4096);
printf("输出DAC电压值:%.2fV\r\n",dac_vol);
}
delay_ms(100);
}
}
注:代码基于普中stm32资料中的实验程序进行改编。