中级会员
 
- 积分
- 249
- 金钱
- 249
- 注册时间
- 2018-10-17
- 在线时间
- 40 小时
|
1金钱
請問各位,我使用正點原子STMF103的開發板我利用Timer3弄成PWM四個通道的輸出,使用軟體
觸發方式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
利用PA.1外接可變電阻,調整可變電阻可以改變PWM的空佔比,到目前都沒有問題
那請問,假如我不使用軟體觸發,也不使用DMA,我想要用成TIMER2外部觸發方式.就是我調整
我的PA.1可變電阻的時候他才會觸發,請問這應該要怎麼做,因為目前軟體觸發的方式
好像比較耗電,就是時時刻刻都在抓電阻值.
請問有現成的範例可以給我參考嗎???
#include "adc.h"
#include "delay.h"
#include "timer.h"
#include "lcd.h"
#include "stm32f10x_it.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5
//////////////////////////////////////////////////////////////////////////////////
//¥»μ{§Ç¥u¨Ñ¾Ç2ߨÏ¥ΡA¥¼¸g§@aì3\¥i¡A¤£±o¥Ωó¨ä¥|¥ô|ó¥Î3~
//ALIENTEK¾ÔÄ¥STM32¶}μoaO
//ADC ¥N½X
//¥¿ÂI-ì¤l@ALIENTEK
//§T3N½×¾Â:www.openedv.com
//-קï¤é′á:2012/9/7
//a©¥»¡GV1.0
//a©Åv©ò|3¡Aμsa©¥2¨s¡C
//Copyright(C) ¼s|{¥«¬ ál1q¤l¬ì§T|3--¤½¥q 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//aì©l¤ÆADC
//3o¸ì§ú-ì¶è¥H3W«h3q1D¬°¨ò
//§ú-ìàq»{±N¶}±ò3q1D0~3
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //¨ÏˉàADC13q1D®éÄá
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //3]¸mADC¤ààW|]¤l6 72M/6=12,ADC3ì¤j®é¶¡¤£ˉà¶W1L14M
//PA1 §@¬°¼òàà3q1D¿é¤J¤T¸}
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //¼òàà¿é¤J¤T¸}
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //′_|ìADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC¤u§@¼ò|¡:ADC1©MADC2¤u§@|b¿W¥ß¼ò|¡
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //¼ò¼ÆÂà′«¤u§@|b3æ3q1D¼ò|¡
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //¼ò¼ÆÂà′«¤u§@|b3æ|¸Âà′«¼ò|¡
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //Âà′«¥Ñ3n¥ó|󤣬O¥~3¡Ä2μo±ò°ê
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC¼Æ¾ú¥k1ï»ô
ADC_InitStructure.ADC_NbrOfChannel = 1; //¶¶§Ç¶i|æ3W«hÂà′«aoADC3q1Dao¼Æ¥Ø
ADC_Init(ADC1, &ADC_InitStructure); //®ú¾úADC_InitStruct¤¤«ü©wao°Ñ¼Æaì©l¤Æ¥~3]ADCxao±H|s¾1
ADC_Cmd(ADC1, ENABLE); //¨Ïˉà«ü©waoADC1
ADC_ResetCalibration(ADC1); //¨Ïˉà′_|ì®Õ·Ç
while(ADC_GetResetCalibrationStatus(ADC1)); //쥫Y′_|ì®Õ·Çμ2§ô
ADC_StartCalibration(ADC1); //¶}±òAD®Õ·Ç
while(ADC_GetCalibrationStatus(ADC1)); //쥫Y®Õ·Çμ2§ô
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //¨Ïˉà«ü©waoADC1ao3n¥óÂà′«±ò°ê¥\ˉà
}
//àò±oADC-è
//ch:3q1D-è 0~3
u16 Get_Adc(u8 ch)
{
//3]¸m«ü©wADCao3W«h2Õ3q1D¡A¤@-ó§Ç|C¡A±Ä¼Ë®é¶¡
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_71Cycles5 ); //ADC1,ADC3q1D,±Ä¼Ë®é¶¡¬°239.5¶g′á
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //¨Ïˉà«ü©waoADC1ao3n¥óÂà′«±ò°ê¥\ˉà
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//쥫YÂà′«μ2§ô
return ADC_GetConversionValue(ADC1); //ae|^3ìañ¤@|¸ADC13W«h2ÕaoÂà′«μ2aG
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //®éÄá¨Ïˉà
//©w®é¾1TIM2aì©l¤Æ
TIM_TimeBaseStructure.TIM_Period = arr; //3]¸m|b¤U¤@-ó§ó·s¨Æ¥ó¸Ë¤J¬¡°êao|Û°ê-«¸Ë¸ü±H|s¾1¶g′áao-è
TIM_TimeBaseStructure.TIM_Prescaler =psc; //3]¸m¥Ψó§@¬°TIMx®éÄáàW2v°£¼Æao1w¤ààW-è
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; //3]¸m®éÄá¤à3Î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down; //TIM|V¤W-p¼Æ¼ò|¡
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //®ú¾ú«ü©wao°Ñ¼Æaì©l¤ÆTIMxao®é¶¡°ò¼Æ3æ|ì
//¤¤Â_àu¥yˉÅNVIC3]¸m
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //¨Ïˉà«ü©waoTIM2¤¤Â_,¤13\§ó·s¤¤Â_
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; ; //TIM2¤¤Â_
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //¥y|ûàu¥yˉÅ0ˉÅ
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //±qàu¥yˉÅ2ˉÅ
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ3q1D3Q¨Ïˉà
NVIC_Init(&NVIC_InitStructure); //aì©l¤ÆNVIC±H|s¾1
TIM_Cmd(TIM2, ENABLE); //¨ÏˉàTIMx
}
void TIM2_IRQHandler(void) //TIM3??
{
u16 adcx;
float temp;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //??TIM3????????
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //??TIMx??????
adcx=Get_Adc_Average(ADC_Channel_1,10);
delay_ms(50);
TIM3_PWM_Init(adcx,adcx,adcx,adcx);
LCD_ShowxNum(156,130,adcx,4,16,0);//Åã¥üADCao-è
temp=(float)adcx*(3.3/4096);
adcx=temp;
LCD_ShowxNum(156,150,adcx,1,16,0);//Åã¥ü1qà£-è,Åã¥ü1qà£-ó|ì¼Æ-è
temp-=adcx;
temp*=1000;
LCD_ShowxNum(172,150,temp,3,16,0X80);//Åã¥ü1qࣤp¼Æ
// LED0=!LED0;
LCD_ShowString(60,250,200,24,24,"hunkchen2000@gmail.com");
LED0=!LED0;
}
}
|
-
|