本帖最后由 爱奔跑的IT 于 2017-3-8 13:34 编辑
我之前做的输出一路pwm dac输出模拟电压已经成功。但是现在发现同样的方法再输出一路模拟电压却不能成功。代码如下,望有识之士能不吝赐教。谢谢。
以下是pwmdac.c文件。成功的是TIM9同样的方法用在TIM14不成功,换TIM12也是这样。
void TIM9_CH2_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE); //TIM9ʱÖÓʹÄÜ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //ʹÄÜ
ORTAʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //GPIOA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //ËÙ¶È100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯
A3
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_TIM9); //GPIOA3¸´ÓÃλ¶¨Ê±Æ÷9 AF3
TIM_TimeBaseStructure.TIM_Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
TIM_TimeBaseStructure.TIM_Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM9,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷9
//³õʼ»¯TIM9 Channel1 PWMģʽ
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
TIM_OCInitStructure.TIM_Pulse=0;
TIM_OC2Init(TIM9, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM9 OC2
TIM_OC2PreloadConfig(TIM9, TIM_OCPreload_Enable); //ʹÄÜTIM9ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
TIM_ARRPreloadConfig(TIM9,ENABLE);//ARPEʹÄÜ
TIM_Cmd(TIM9, ENABLE); //ʹÄÜTIM9
}
void TIM14_CH2_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM9ʱÖÓʹÄÜ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); //ʹÄÜ
ORTAʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //GPIOA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //ËÙ¶È100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
GPIO_Init(GPIOG,&GPIO_InitStructure); //³õʼ»¯
A3
GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_TIM14); //GPIOA3¸´ÓÃλ¶¨Ê±Æ÷9 AF3
TIM_TimeBaseStructure.TIM_Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
TIM_TimeBaseStructure.TIM_Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷9
//³õʼ»¯TIM14 Channel1 PWMģʽ
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
TIM_OCInitStructure.TIM_Pulse=0;
TIM_OC2Init(TIM14, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM9 OC2
TIM_OC2PreloadConfig(TIM14, TIM_OCPreload_Enable); //ʹÄÜTIM9ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPEʹÄÜ
TIM_Cmd(TIM14, ENABLE); //ʹÄÜTIM9
}
你下载我们例程,测试下看看正常么?
例程用的按键,我是直接串口发送数据,但是只要连续发送数据的时间间隔短到一定程度输出的dac值就会响应不过来,或者直接就是接近0的值,但是数据收发都是正常的就是dac的值不正常。这种情况可能会是拿些原因导致的呢,部分代码我会粘贴上,麻烦原子哥给看看,一直找不出原因,,,
数据分析的代码如下:
[mw_shl_code=c,true]while(1)
{
if(timex)timex--;
if(timex==1)LCD_Fill(30+54,100,239,112,WHITE);
t++;
delay_ms(10);
if(USART3_RX_STA&0X8000) //接收到一次数据
{
rlen=USART3_RX_STA&0X7FFF; //得到接收数据的长度
USART3_RX_BUF[rlen]=0; //添加结束符
strncpy(USART3_SEND_BUF_DATE,&USART3_RX_BUF[12],5);//得到其他控制符
date= atoi(USART3_SEND_BUF_DATE);
strncpy(USART3_SEND_BUF_LEFT,&USART3_RX_BUF[17],4);//得到左电机速度值
left = atoi(USART3_SEND_BUF_LEFT);
strncpy(USART3_SEND_BUF_RIGHT,&USART3_RX_BUF[21],4);//得到右电机速度值
right= atoi(USART3_SEND_BUF_RIGHT);
if((date/10000)==1) //µç»úÆô¶¯
{
GPIO_SetBits(GPIOG,GPIO_Pin_12); //左电机使能
if(((date/1000)%10)==1)//左电机正转
{
GPIO_SetBits(GPIOG,GPIO_Pin_11);
if(date/100%10==1)
{
GPIO_SetBits(GPIOG,GPIO_Pin_2);//右电机正转
}
else
{
GPIO_ResetBits(GPIOG,GPIO_Pin_2);//右电机反转
}
}
else //左电机反转
{
GPIO_ResetBits(GPIOG,GPIO_Pin_11);
if(date/100%10==1)
{
GPIO_SetBits(GPIOG,GPIO_Pin_2);////右电机正转
}
else //if(date/100%10==0)
{
GPIO_ResetBits(GPIOG,GPIO_Pin_2);//右电机反转
}
}
if(USART3_RX_STA&0X8000)
{
Dac1_Set_Vol(left); //左电机dac输出
left=0;
Dac2_Set_Vol(right); //右电机dac输出
right=0;
}
}
printf("%d ",&USART3_RX_BUF[12]); //发送到串口
sprintf((char*)p,"接收了%d字节,内容如下",rlen-12);//接收到的数据长度
LCD_Fill(30+54,115,239,130,WHITE);
POINT_COLOR=BRED;
Show_Str(30+54,115,156,12,p,12,0); //显示接收的数据长度
POINT_COLOR=BLUE;
LCD_Fill(30,130,239,319,WHITE);
Show_Str(30,130,180,190,&USART3_RX_BUF[12],12,0);//显示接收的数据
USART3_RX_STA=0;
if(constate!='+')t=1000; //状态还未连接,立即更新
else t=0; //状态已连接
}
if(t==3000)//30s检查一次连接是否存在
{
LCD_Fill(30+54,125,239,130,WHITE);
LCD_Fill(60,80,120,92,WHITE);
constate=atk_8266_consta_check();//得到连接状态
if(constate=='+')Show_Str(30+30,80,200,12,"连接成功",12,0); //连接状态
else Show_Str(30+30,80,200,12,"连接失败",12,0);
t=0;
}
if((t%20)==0)LED0=!LED0;
atk_8266_at_response(1);
}[/mw_shl_code]
一周热门 更多>