2 my angle2016 my_angle2016 于 2016.03.31 11:48 提问

如何通过调节电位器,控制pwm占空比

初学stm8单片机,用stm8s003F 编写的一个小程序
1、 RT1是色温调节3200K/5600K转换电位器外接PD5的AD口
2、 RT2是亮度调节电位器外接PD6的AD口
3、PC6、PC7是PWM输出32khz的频率,根据检测到PD5/PD6的电压调节占空比,达到调光的效果
下面是我的功能代码,不知哪里有误,一直输不出pwm,麻烦各位大神帮忙看看。

void Init_ADC_GPIO(void)
{
GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT);//PD5
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);//PD6
GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_SLOW); //PC6低速推挽输出高电平
GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_SLOW);//PC7低速推挽输出高电平
}
void ADC_Init(void)
{
Init_ADC_GPIO();
ADC1_DeInit();
ADC1->CSR = 0x05; //seclect AIN5 (PD5) as channel to be converted
ADC1->CR1 = 0x40; //Fadc = Fmaster/8 = 2MHz
ADC1->CR2 = 0x08; //Right alignement*/
ADC1->CSR = 0x06; //seclect AIN6 (PD6) as channel to be converted
ADC1->CR1 = 0x40; //Fadc = Fmaster/8 = 2MHz
ADC1->CR2 = 0x08; //Right alignement*/
/*开启ADC1控制器*/
ADC1_Cmd(ENABLE);
/*开始进行ADC1模数转换*/
ADC1_StartConversion();

}
void TIM_Init(void)
{
TIM1_DeInit(); //定时器1复位
TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP, 1000, 0);//定时器1时基初始化
/* Channel 5 PWM configuration /
TIM1_OC1Init(TIM1_OCMODE_PWM1,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_DISABLE, u16_adc1_value,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_LOW,TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_RESET);
TIM1_OC1PreloadConfig(ENABLE);
/
Channel 6 PWM configuration */
TIM1_OC2Init(TIM1_OCMODE_PWM1,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_DISABLE, u16_adc2_value,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_LOW,TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_RESET);

TIM1_OC2PreloadConfig(ENABLE);
TIM1_PrescalerConfig(1, TIM1_PSCRELOADMODE_UPDATE);
TIM1->ARRH=0; //初始化自动装载寄存器,决定PWM方波的频率
TIM1->ARRL=256; //初始化自动装载寄存器,决定PWM方波的频率
/* Enables TIM1 peripheral Preload register on ARR */
TIM1_ARRPreloadConfig(ENABLE); //自动加载使能
TIM1_Cmd(ENABLE);
}

uint16_t get_adc(void)
{
int j=0;
ADC1_Cmd(ENABLE); //ADC1->CR1 |= 0x01;//ADC使能
for ( j = 40;j > 0;j--);//等待7us
ADC1_StartConversion(); //ADC1->CR1 |= 0x01; //开始转换
while (!(ADC1->CSR & 0x80)); //等待转换结束
ADC1->CSR &= ~0x80; //清除转换结束标志
u16_adc1_value =((((unsigned int)ADC1->DRH)<DRL);// 结果送入u16_adc1_value缓冲区
TIM1->CCR1H =0x00;
TIM1->CCR1L =(unsigned char)(u16_adc1_value>>2);
u16_adc2_value =((((unsigned int)ADC1->DRH)<DRL);// 结果送入AD_Value缓冲区
TIM1->CCR2H =0x00;
TIM1->CCR2L =(unsigned char)(u16_adc2_value>>2);//结果由PD7口送出至LED
ADC1_ClearITPendingBit((ADC1_IT_TypeDef)ADC1_IT_EOC); //清楚转换标志
return u16_adc1_value,u16_adc2_value;
}
void CLK_init(void)/*时钟初始化,2分频*/
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);
}
void main(void)
{
uint16_t chanel; //通道
int i=0;
TIM_Init();
ADC_Init();
Init_ADC_GPIO();
while(1)
{
get_adc();

if(channel==ADC1_CHANNEL_5)
{
// 下面的循环将占空比逐渐从0递增到50% 
for(i=0;i<128;i++) 
{ 

 //PC6输出占空比

TIM1->CCR1H = 0; 
TIM1->CCR1L = i; 
DelayMs(5); 
} 
// 下面的循环将占空比逐渐从50%递减到0 
for(i=128;i>0;i--) 
{ 
//PC7输出占空比

TIM1->CCR1H = 0; 
TIM1->CCR1L = i; 
DelayMs(5); 

}

}
if(channel==ADC1_CHANNEL_5)
{

// 下面的循环将占空比逐渐从0%递减到50
for(i=0;i {
//PC7输出占空比
TIM1->CCR2H = 0;
TIM1->CCR2L = i;
DelayMs(5);
}
// 下面的循环将占空比逐渐从50%递减到0
for(i=128;i>0;i--)
{
//PC6输出占空比
TIM1->CCR2H = 0;
TIM1->CCR2L = i;
DelayMs(5);
}
}
}
}

1个回答

zl199203
zl199203   2016.04.12 20:56

我只用过stm32的arm,但是据我观察,你的tim1配置了pwm,但是你使能了pwm输出吗?或者io配置成输出模式了吗?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!